最近在做sqoop导入oracle数据到hive字符集乱码问题,虽然没有解决,但是现在将一些尝试的过程发布,供大家参考,以后有遇到这种问题的供大家参考少走弯路。
oracle里面的字符集是us7ascii,导入到hive里面后中文乱码hive环境(元数据为mysql)字符集是utf,在命令里面使用convert(rd_yj,'UTF8','US7ASCII')和utl_raw.cast_to_varchar2(utl_raw.cast_to_raw(rd_yj))做转换都不行,
这个是命令:sqoop import --connect jdbc:oracle:thin:@ip:1521:dname --username x --password x --query "select convert(rd_yj,'UTF8','US7ASCII') from dj_fzcgl where \$CONDITIONS" -m 1 --target-dir /user/hive/warehouse/sichuan.db/dj_fzcgl_test --hive-table dj_fzcgl_test --hive-import --as-parquetfile
ps:其他oracle的库使用字符集是gbk hive导入不乱码;
考虑过修改数据库字符集(alter database character set utf),但是数据库字符集建立后一般不改,修改字符集相当于重建数据库,而且已经导入的表不会因为修改字符集而重新编码;
可以考虑用文件入库,oracle的spool可以轻松实现将数据库导出到txt,重建数据库或者新建一个数据库实例,设置对应的字符集,oracle提供了sqlldr的工具可以快速将文本导入oracle,但是现在有几十个表,数据量都很大(300G),数据库又在远程,所以不太好操作;
直接在指令后添加:zxptus7?useUnicode=true&characterEncoding=utf-8,运行报错,不认识这种指令(这个对于mysql导入hive是可以的)
可以考虑做一个Java工具类里面实现将读取数据进行转码,但是这是将sqoop已经导入hive的数据在处理一下,感觉不太合适,
sqoop没有提供导入过程中的转码指令参数,好像不能再导入过程中转码,
sqoop对接db也是走的jdbc,只是帮你做了任务切片和分布~ 单点和datax一样的~,所以可以考虑将jdbc作为一个点,
csdn上有一个大神将jdbc的jar hack了(http://download.csdn.net/detail/jiangdongping/4360247#comment ),就是在导入oracle时候可以在URL后面添加转码:jdbc:oracle:thin:@ip:1521:zxptus7?useUnicode=true&characterEncoding=utf-8
对于乱码产生的一些总结,不一定正确,仅供参考:
数据在oracle里面是以ascii字符集编码构成数据的表现形式,现在导入到另一个环境,编码格式为utf,数据的编码格式就会改变,数据就是变成utf编码构成的数据表现形式,就有可能出现乱码的情况
ascii是所有字符集的基础~ 仅能表达英文和符号~ 本身就不支持cjk或者其他的文字
编码是将虚拟的字符按照某个编码方式转化为数值表达即byte~
解码即逆过程~
最早的全文字支持是unicode编码表~
所有的utf都属于转码~ 是基于unicode~ 不存在编码表~
而之后每个国家认为原有的unicode不能体现自己国家文字规律会重新编排新的码表~ 例如gbk