我在 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_stageINSERT INTO TABLE log SELECT * FROM log_stage 数据插入到 Hive/Impala Parquet 支持的表中。这是 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 )都设置为“美国/丹佛”,目前比 UTC 晚 7 小时。

似乎 Impala 正在处理已经在 UTC 中的事件,错误地假设它们是在美国/丹佛时间,然后又增加了 7 个小时。

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

最佳答案

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

This blog post 对该问题进行了简要描述:



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

关于timezone - Impala 时间戳与 Hive 不匹配 - 时区问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33556226/

10-09 07:08
查看更多