hive mysql日期减一天_Datax-Mysql同步至Hive时时区问题导致日期减少一天

在Datax从MySQL同步数据到Hive时,部分date类型字段在转换为Hive的string类型时会减少一天。问题可能与时区有关,因为Hive writer使用了'GMT+8'时区,而MySQL reader未指定。1986-1991年间,中国实行夏令时,这解释了特定日期为何提前一天。解决方案包括调整时区设置或修改代码以避免时区影响。
摘要由CSDN通过智能技术生成

一、问题背景

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值