多种字符集并存情况下sqoop从MySQL导入HBase中文乱码解决

时间:2022-09-22 20:53:08

最近在做binlog日志采集同步到数据平台的事。刚开始需要借助sqoop将从库数据表数据初始化到hbase中,整个过程都需要自动化进行,尽量减少人为干预。但是,由于历史原因,线上存在两种字符集格式的数据库(表),而导入到hbase的数据我们需要统一采用utf-8格式存储。sqoop直接导入的话,没法控制中文字符转码工作。所以需要对sqoop源码进行简单改动支持这种方式。

大体思路是,通过定义一个接口可以从InformationSchema库的tables中获取某个表的table-collation。这样做的原因是我们关注的字符集粒度确定到表级别, 因为有些库虽然是utf但是表确是latin1。将获取到的table-collation放入ImportJobContext中,进而将其放入HBaseImportJob的conf中。之后通过HBasePutProcessor将其设入ToStringPutTransformer的tableCollation属性中,最后在完成Put对象组装过程中,就会利用上该属性判断是否需要针对latin1和utf8的字符串数据进行转码。

同时还要注意在开始时,获取到数据库连接的方法中,需要首先执行一个query  "set names utf8"。

具体代码可以参考:http://url.cn/UmWQUd ,全卷搜索huanggang,可以看到所有改动的代码片段。