flink或datax同步hbase到其他库错行问题
1 问题描述
1.1 datax
当前业务数据统一存储在hbase,某一天oracle/mysql需要一些同步数据时,我们用datax处理hbase到oracle/mysql时出现错行问题,即一条数据错成两条(或多条)来处理
1.2 doris
业务存储切换时,切换到doris时,由hbase的部分数据同步到doris中也存在了错行问题(flink处理),报错如下
Reason: actual column number is less than schema column number. actual number: 10 column separator: [$], line delimiter: [
], schema number: 15; . src line: [2105150472$3$3$2021-05-15$xxx$FSH$2.31$mIU/mL$$|3.5-12.5|4.7-21.5|1.7-7.7|25.8-134.8];
Reason: actual column number is less than schema column number. actual number: 6 column separator: [$], line delimiter: [
], schema number: 15; . src line: [$$$$$];
doris数据表数据使用$分割,有15列,可以看到数据接分成两份,从而导致同步失败
2 问题发现
2.1 hbase主键查询
hbase(main):013:0> get 'xxxtable','2021-05-15--210515047233'
COLUMN CELL
f:DCNY timestamp=1635995303552, value=
f:DCNY_TYPE timestamp=1635995303552, value=
f:MEMO timestamp=1635995303552, value=
f:MIC timestamp=1635995303552, value=
f:RAD timestamp=1635995303552, value=
f:REF_VAL timestamp=1635995303552, value=|3.5-12.5|4.7-21.5|1.7-7.7|25.8-134.8\x0A
.....
可以发现REF_VAL存在 \x0A,即换行符
2.2 flink的sql-client查询
这里我从REF_VAL的length为10开始
select SUBSTR(REF_VAL,10),RSLT_UNT,MIC,RAD from xxx where rowkey='2021-05-15--210515047233';
可以看到数据出现错行
3 解决方案
3.1 数据处理
(耗时长,数据处理有风险)
处理掉存在换行的数据
3.2 函数处理
替换掉出现\n的字段
REGEXP_REPLACE(xxx,'\n','')