alibaba / DataX

DataX是阿里云DataWorks数据集成的开源版本。
Other
15.96k stars 5.45k forks source link

空值转换成日期类型报错 #1037

Open daizc1 opened 3 years ago

daizc1 commented 3 years ago

目标表有个字段是日期格式的,但源表有些值是空的,转换后老报错。 [INFO] 2021-06-03 17:04:55.815 - [taskAppId=TASK-33-10254-133171]:[127] - -> java.sql.SQLException: TIMESTAMP 类型转换错误:[{"byteSize":0,"rawData":"","type":"STRING"}] at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.fillPreparedStatementColumnType(CommonRdbmsWriter.java:497) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na] at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.fillPreparedStatement(CommonRdbmsWriter.java:405) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na] at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doOneInsert(CommonRdbmsWriter.java:380) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na] at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doBatchInsert(CommonRdbmsWriter.java:362) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na] at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.startWriteWithConnection(CommonRdbmsWriter.java:291) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na] at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.startWrite(CommonRdbmsWriter.java:319) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]

Y-evil commented 2 years ago

这是因为在读的时候就出问题,当你读数据时,默认使用String类型,即所有数据都转换为String。源码在插件plugin-unstructured-storage-util的UnstructuredStorageReaderUtil.transportOneRecord()方法里,这个方法有BUG。Datax支持你在配置的json文件中指定某列的类型(Datax当前只有String,long,double,boolean,date这五种类型),你看下这个类的源码就明白了。默认不指定所有列的类型,不指定时默认使用StringColumn。但当你指定时,这个方法的循环有点问题,它逻辑写错了,还有当日期为null时,CSVReader默认读出来的是String[],即null会读成“”,当字段是日期类型时,你做好加个空字符串判断,源码里只判断null。