2015-11-05 40 views
2

我有一些事件日志数据在HDFS,在其原始格式,看起来是这样的:Impala时间戳与Hive不匹配 - 时区问题?

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查询:INSERT INTO TABLE log SELECT * FROM log_stagelog_stage数据插入Hive/Impala 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' 

的问题:在因帕拉查询时,时间戳是领先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)都设置为“美国/丹佛”,这比当前时间晚7小时。

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

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

回答

9

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

This blog post有问题的简要说明:

当配置单元存储时间戳值转换成平面形式,它的本地时间转换成UTC时间,当读取数据时,将其转换回本地时间。另一方面,Impala在读取时间戳记字段时不进行转换,因此,UTC时间将返回而不是本地时间。

的impalad标志告诉帕拉读取由蜂巢产生在镶木时间戳时做转换。它确实会产生一些小的成本,所以如果这对您是一个问题(尽管可能很小),您应该考虑使用Impala编写时间戳。

+0

这是一个梦幻般的答案。谢谢马特! –

2

相关提示,如蜂房V1.2的,你也可以使用此标志禁用时区转换行为:

hive.parquet.timestamp.skip.conversion 

当前蜂巢实现地板专卖店的时间戳为UTC,这个标志允许转换的其他工具的阅读拼花文件跳跃。

此溶液中加入如https://issues.apache.org/jira/browse/HIVE-9482

最后,没有时区的一部分,确切地说,但对于C Spark的兼容性(v1。3及以上)和帕拉木地板上的文件,有此标志:

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