在Hive的ODS层建表语句中,我以“,”为分隔符;
fields terminated by ','
在DataX的json文件中,我也以“,”为分隔符。
"fieldDelimiter": ","
但是运行DataX脚本文件进行迁移时,会出现如下错误
经DataX智能分析,该任务最可能的错误原因是:
com.alibaba.datax.common.exception.DataXException: Code:[Framework-14],
Description:[DataX传输脏数据超过用户预期,
该错误通常是由于源端数据存在较多业务脏数据导致,
请仔细检查DataX汇报的脏数据日志信息, 或者您可以适当调大脏数据阈值 .]
. - 脏数据条数检查不通过,限制是[0]条,但实际上捕获了[25]条.
经过分析,原因是在使用df.write.mode("overwrite").saveAsTable("table_name")将DataFrame保存为表时,并不会使用分隔符来分隔数据。这是因为在Spark中,表数据是以列式存储的,而不是以行式存储。当使用saveAsTable方法将DataFrame保存为表时,数据会被序列化为一种列式存储的格式(例如Parquet、ORC等),并且与表的元数据一起存储在指定的位置。这就使得DataX脚本在运行过程中,不能以“,”为分隔符进行分隔,出现脏数据。
将原代码修改为保存表时将分隔符指定为“\t”,序列化格式为“\t”,DataX的json文件中也以“\t”为分隔符,即可解决问题,成功迁移。
df.write.format("Hive")
.mode("overwrite")
.option("delimiter", "\t")
.option("serialization.format", "\t")
.saveAsTable("table_name")
DataX的json文件中的分隔符:
"fieldDelimiter": "\t"