Datastage作业使用ODBC Greenplum Wire Protocol驱动从Netezza加载数据到Greenplum失败
Greenplum_Connector_0,0: 如下SQL语句执行失败:INSERT INTO GPCC_TT_20211121154035261_15420_0_XXXXX_TABLE_NAME (COLUMN1,COLUMN2,...) SELECT COLUMN1,COLUMN2,... FROM GPCC_ET_20211121154035417_15420_0。语句报错原因如下:[SQLCODE=HY000][Native=3,484,948] [IBM (DataDirect OEM)][ODBC Greenplum Wire Protocol driver][Greenplum]ERROR: 列"xyz_id"缺失数据 (seg2 slice1 192.168.0.0:00 pid=30826)(发生位置:外部表gpcc_et_20211121154035417_15420_0,gpfdist://ABCD:123/DDCETLMIG_15420_gpw_3_3_20211121154035261的第91行: "AG?199645?ABCD EFGH. - HELLOU - JSF RT ADF?MMM?+1?A?DAD. SDA?0082323209?N?N..."; 文件copy.c; 第5211行; 函数NextCopyFromX; )
报错根因分析
该报错是Greenplum通过gpfdist加载外部文本数据时的字段解析失败问题,核心根因分为4类:
- 分隔符不匹配:Netezza导出数据用的字段分隔符和Greenplum外部表定义的分隔符不一致,或者分隔符存在于异常行的字段值中,导致字段被拆分错位,
xyz_id对应的位置没有有效数据 - 行数据异常:报错指向的第91行存在换行符、不可见特殊字符,导致Greenplum解析时将单行拆分为多行,字段数量少于表定义的字段数,触发缺失数据报错
- 非空约束校验失败:
xyz_id列在外部表/目标表定义了NOT NULL约束,而第91行的源数据对应列确实为空,触发约束校验 - 字段定义不匹配:外部表的字段数量、顺序和Netezza导出的字段数量、顺序不一致,导致
xyz_id对应位置没有数据
排查解决步骤
- 首先定位异常原始数据:登录gpfdist服务所在的ABCD服务器,找到对应加载文件,执行命令
sed -n '91p' DDCETLMIG_15420_gpw_3_3_20211121154035261提取第91行内容,和正常行对比字段数量、格式差异 - 校验分隔符配置:确认Netezza导出配置的分隔符和Greenplum外部表定义的分隔符完全一致,如果分隔符存在于字段值中,更换为源数据中不存在的特殊字符作为分隔符(例如不可见字符
0x01) - 兼容异常数据配置:可以在Greenplum外部表定义中添加
FILL_MISSING_FIELDS true、REMOVE_INVALID_CHARS true参数,也可以在Datastage的Greenplum连接器配置中开启异常数据跳过、错误日志落表的选项,先加载正常数据再单独处理异常行 - 校验字段约束和定义:检查
xyz_id列的非空约束,如果源端确实存在空值,要么调整表结构删除非空约束,要么在加载逻辑中给空值配置默认值;同时对比外部表和源端的字段顺序、数量,确保完全匹配
内容的提问来源于stack exchange,提问作者Lawren Alex
相关产品推荐
相关产品推荐

