一、背景
- 早上往ck推数的任务突然报错,处理了好久,记录一下
- 报错信息如下
ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: ckpub53.olap.jd.com, port: 2000; Code: 27. DB::ParsingException: Cannot parse input: expected '\t' before: ' \t未知\t1\t搜索\tapp\t50\t1\t50\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t':
Row 3516:
xxxxx
ERROR: garbage after Int32: " <TAB>未知<TAB>1"
: While executing ParallelParsingBlockInputFormat: (at row 40780)
. (CANNOT_PARSE_INPUT_ASSERTION_FAILED) (version 22.3.2.1)
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.getException(ClickHouseExceptionSpecifier.java:91)
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:55)
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:28)
at ru.yandex.clickhouse.ClickHouseStatementImpl.checkForErrorAndThrow(ClickHouseStatementImpl.java:875)
二、原因
-
向ClickHouse中插入数值型数据时,如果数据为空,则会导致列错乱
-
排查过程:
- 刚开始我认为是Row 3516:xxxxx 的问题,从hive查询之后发现该条数据没有问题(误导人啊😂)
- 后来一系列排查,排查到了是hive表
脏数据+类型强转
的问题(hive和ck表结构不一致。。。上游流量迭代json等一系列原因,移交任务害死人啊。。。😂)- `1. hive和ck字段类型不匹配 (hive 字段类型 string 、ck 字段类型 int)
- 2.int类型跟空格导致强转为null,而往CK插入数值型数据时,如果数据为空,则会导致列错乱
三、解决
处理CK当中int 类型字段 的 null值
- 我的场景下一方面快速修复应用层保障履约,一方面处理底层流量解析剔除脏数据
- 之后需注意
- ck建表
- 1.保持字段类型一致
- 2.如果ck是int类型,需要处理null值
- ck建表