datax导数hdfs->postgresql 报错。
个人使用的是datax+dolphin来执行调度任务的。平常分分钟就解决问题了。
今天不知道扎回事,总感觉不对劲。
背景:从hive的odsmdmdata.sms_vendor_xxxx导数据到postgresql的ia_fdw_profile.it_sms_vendor_site_t
备注 hive的odsmdmdata.sms_vendor_xxxx数据来自oracle。。

结果发现报错,很正常,直接看日志

刷到最下面刷新两下。发现还是没看到报错。等了会发现卡在这。。。点击右上角的下载日志。

提取主要信息
报错原因 org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00
报错数据 id=2624988
直接百度。发现很多都是用其他工具导数oracle->postgresql报错了的。
提取核心
postgresql官方文档发现,这是postgresql独有的错误信息,直接原因是varchar型的字段或变量不接受含有'\0'(也即数值0x00、UTF编码'\u0000')的字符串 。官方给出的解决方法:事先去掉字符串中的'\0'
我看oracle都是可以通过chr(0)来查出来的。

那么就要找到错误数据在哪了。 在oracle查询数据
select
replace(sms_site_id ,chr(0),'cclovezbf')
replace(sms_vendor_id ,chr(0),'cclovezbf'),
replace(vendor_site_code ,chr(0),'cclovezbf'),
replace(oracle_vendor_id ,chr(0),'cclovezbf'),
replace(oracle_vendor_site_id ,chr(0),'cclovezbf'),
replace(oracle_vendor_site_code ,chr(0),'cclovezbf'),
replace(org_id ,chr(0),'cclovezbf'),
replace(sms_manage_id ,chr(0),'cclovezbf'),
replace(bank_type ,chr(0),'cclovezbf'),
replace(bank_card_type ,chr(0),'cclovezbf'),
replace(account_type ,chr(0),'cclovezbf'),
replace(account_status ,chr(0),'cclovezbf'),
replace(check_type ,chr(0),'cclovezbf'),
replace(check_date ,chr(0),'cclovezbf'),
replace(account_status_msg ,chr(0),'cclovezbf'),
replace(account_status_msg_std ,chr(0),'cclovezbf'),
replace(is_domestic ,chr(0),'cclovezbf'),
replace(bank_name ,chr(0),'cclovezbf'),
replace(branch_name ,chr(0),'cclovezbf'),
replace(bank_account_name ,chr(0),'cclovezbf'),
replace(bank_account_num ,chr(0),'cclovezbf')。。。。。。
from table
定位到字段为bank_account_num 。

解决问题有了 那就是replace 在以前oracle->hive的导数脚本里把这个替换就好了。
但是有没有更好的办法呢?比如直接在hive里替换。。答案是有的,至于为什么是\u0000 是我看很多文章都说这个特殊字符是0x00 或者\u0000 试出来的。
select
bank_account_num,
regexp_replace(bank_account_num,'\\s+','cclovezbf'),
replace(bank_account_num,'\u0000','cclovezbf')
from odsmdmdata.sms_vendo_xxxx where sms_site_id ='2624988'

但是这个并没有什么卵用。。。。。。因为datax的hdfsreader的配置文件里没有 对column进行修改。所以还是在oracle端修改。。。。

更多推荐



所有评论(0)