一、问题背景
Datax从Mysql数据库到Hive数据同步任务时,发现同步时,date类型字段同步到Hive里中string类型字段时,部分日期会减少一天。
二、集群环境
Datax版本:3.0
三、现象描述
mysql数据库时间
Hive数据库中时间
1986-07-17
1986-07-16
1987-06-26
1987-06-25
1987-12-08
1987-12-08
1988-05-18
1988-05-17
1989-08-08
1989-08-07
1997-08-08
1997-08-08
以上数据是测试时,发现的情况,可以看到对于某些特定日期数据来说,日期往前推移了一天。而且hive表中接收的字段必须是string类型的,对于hive也是date类型的数据不会有这种问题,对于这种现象令人十分迷惑,只能先从代码上找找原因所在,但可以确定大概率的问题应该出在类型转换上。
四、Datax代码
Reader代码Date类型转换:
CommonRdbmsReader:
protected Record buildRecord(RecordSender recordSender,ResultSet rs, ResultSetMetaData metaData, int columnNumber, String mandatoryEncoding,
TaskPluginCollector taskPluginCollector) {
Record record = recordSender.createRecord();
try {
for (int i = 1; i <= columnNumber; i++) {
switch (metaData.getColumnType(i)) {
...
// for mysql bug, see http://bugs.mysql.com/bug.php?id=35115
case Types.DATE:
if (metaData.getColumnTypeName(i).equalsIgnoreCase("year")) {
record.addColumn(new LongColumn(rs.getInt(i)));
} else {
record.addColumn(new DateColumn(rs.getDate(i)));
}
break;
...
}
}
} catch (Exception e) {
if (IS_DEBUG) {
LOG.debug("read data " + record.toString()
+ " occur exception:", e);
}
//TODO 这里识别为脏数据靠谱吗?
taskPluginCollector.collectDirtyReco