现象
在使用datax同步mysql数据到hive的时候,发现有些时间字段同步之后时间少了8小时。
下面分析一下具体情况。
背景知识
首先,明确一下hive支持的时间类型和datax支持的时间类型有哪些。
先看一下datax支持的数据类型:
这是datax GitHub上的文档,可以看到datax支持的时间类型只有date和timestamp。
接下来看一下hive3.x支持的数据类型:
可以看到,hive也支持date和timestamp两种时间类型。
但是datax和hive都不支持datetime类型,而我们的mysql中很多时间字段存储的都是datetime类型的,我这里也是在这个类型上出现的问题。
具体情况
mysql中有一个字段(假设为createtime),其类型为datetime。由于datax和hive都不支持datetime类型,但支持string、date和timestamp。一开始没有多想,就在datax中用string类型写出,hive中用timestamp接收。结果就出现同步到hive后对应的时间少了8小时。
这个问题是datax进行时间类型字段的类型转换时产生的,具体可以看一下datax源码。
解决办法
后来将datax中的写出类型由string类型改为timestamp类型后(mysql为datetime类型、datax为timestamp类型、hive为timestamp类型),就没有问题了。