Impala时间戳与Hive不匹配 - 时区问题?

时间:2015-11-05 22:44:34

标签: timezone hive impala

我在HDFS中有一些事件日志数据,其原始格式如下所示:

2015-11-05 19:36:25.764 INFO    [...etc...]

外部表格指向此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'

为了提高性能,我们想在Impala中进行查询。通过执行Hive查询将log_stage数据插入到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'

问题:在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

注意:服务器的时区(来自/etc/sysconfig/clock)都设置为“America / Denver”,目前比UTC晚7个小时。

似乎Impala正在接收已经在UTC中的事件,错误地假设他们在美国/丹佛时间,并再增加7个小时。

您知道如何同步时间以使Impala表与Hive表匹配吗?

4 个答案:

答案 0 :(得分:13)

Hive以不同的方式将时间戳写入Parquet。您可以使用impalad标志-convert_legacy_hive_parquet_utc_timestamps告诉Impala在读取时进行转换。有关详细信息,请参阅TIMESTAMP documentation

This blog post简要介绍了该问题:

  

当Hive将时间戳值存储为Parquet格式时,它会将本地时间转换为UTC时间,当它读取数据时,它会转换回本地时间。另一方面,Impala在读取时间戳字段时不进行转换,因此返回UTC时间而不是本地时间。

impalad标志告诉Impala在Hive生成的Parquet 中读取时间戳时进行转换。它确实会产生一些小的成本,所以你应该考虑用Impala编写你的时间戳,如果这对你来说是一个问题(虽然它可能很小)。

答案 1 :(得分:2)

在相关说明中,从Hive v1.2开始,您还可以使用此标志禁用时区转换行为:

hive.parquet.timestamp.skip.conversion

当前Hive实施的镶木地板时间戳为UTC,此标志允许跳过从其他工具读取镶木地板文件的转换。

这是作为https://issues.apache.org/jira/browse/HIVE-9482

的一部分添加的

最后,不是时区,但为了兼容Spark(v1.3及更高版本)和Impala在Parquet文件上,有这样的标志:

spark.sql.parquet.int96AsTimestamp

https://spark.apache.org/docs/1.3.1/sql-programming-guide.html#configuration

其他:https://issues.apache.org/jira/browse/SPARK-12297

答案 2 :(得分:1)

由于https://issues.apache.org/jira/browse/IMPALA-2716

而对上述答案非常小心

就目前而言,最佳解决方法是不使用TIMESTAMP数据类型并将时间戳存储为字符串。

答案 3 :(得分:1)

如在 https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_timestamp.html

您可以使用----use_local_tz_for_unix_timestamp_conversions=true--convert_legacy_hive_parquet_utc_timestamps=true来匹配Hive结果。

第一个确保您在使用任何datetime函数时将其转换为本地时区。您可以将其设置为本文档中提到的Impala Daemon启动选项。

https://docs.cloudera.com/documentation/enterprise/5-6-x/topics/impala_config_options.html

相关问题