我在 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
将 INSERT 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/