Ale*_*ord 3 timezone hive impala
我在HDFS中有一些事件日志数据,其原始格式如下所示:
2015-11-05 19:36:25.764 INFO [...etc...]
Run Code Online (Sandbox Code Playgroud)
外部表指向此HDFS位置:
CREATE EXTERNAL TABLE `log_stage`(
`event_time` timestamp,
[...])
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
Run Code Online (Sandbox Code Playgroud)
为了提高性能,我们想在Impala中进行查询.log_stage通过执行Hive查询将数据插入到Hive/Impala Parquet支持的表中:INSERT INTO TABLE log SELECT * FROM log_stage.这是Parquet表的DDL:
CREATE TABLE `log`(
`event_time` timestamp,
[...])
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
Run Code Online (Sandbox Code Playgroud)
问题:在Impala中查询时,时间戳提前7个小时:
Hive time: 2015-11-05 19:36:25.764
Impala time: 2015-11-06 02:36:25.764
> as.POSIXct("2015-11-06 02:36:25") - as.POSIXct("2015-11-05 19:36:25")
Time difference of 7 hours
Run Code Online (Sandbox Code Playgroud)
注意:服务器的时区(from /etc/sysconfig/clock)都设置为"America/Denver",目前比UTC晚7个小时.
似乎Impala正在接收已经在UTC中的事件,错误地假设他们在美国/丹佛时间,并再增加7个小时.
您知道如何同步时间以使Impala表与Hive表匹配吗?
Mat*_*att 13
Hive以不同的方式将时间戳写入Parquet.您可以使用impalad标志-convert_legacy_hive_parquet_utc_timestamps告诉Impala在读取时进行转换.有关更多详细信息,请参阅TIMESTAMP文档.
此博客文章简要介绍了该问题:
当Hive将时间戳值存储为Parquet格式时,它会将本地时间转换为UTC时间,当它读取数据时,它会转换回本地时间.另一方面,Impala在读取时间戳字段时不进行转换,因此返回UTC时间而不是本地时间.
impalad标志告诉Impala在读取Hive生成的 Parquet中的时间戳时进行转换.它确实会产生一些小的成本,所以你应该考虑用Impala编写你的时间戳,如果这对你来说是一个问题(虽然它可能很小).