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

最近在做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,可以看到所有改动的代码片段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值