2015-11-05 3 views
2

У меня есть некоторые данные EVENTLOG в HDFS, что в сыром виде, выглядит следующим образом:Временные метки Impala не совпадают с Hive - проблема с часовым поясом?

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

An внешних точек таблицы в этом 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' 

производительности, мы хотели бы запросить это в Импале. Данные log_stage вставляются в таблицу с табличкой с табличкой «Улей/Импала», выполняя запрос «Куст»: INSERT INTO TABLE log SELECT * FROM log_stage. Вот 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) все установлен в «Америка/Денвер», в настоящее время на 7 часов меньше UTC.

Похоже, что Impala принимает события, уже находящиеся в UTC, ошибочно полагая, что они находятся в Америке/Денвере, и добавляет еще 7 часов.

Вы знаете, как синхронизировать время, чтобы таблица Impala соответствовала таблице Hive?

ответ

9

Hive записывает временные метки в паркет по-разному. Вы можете использовать флаг impalad -convert_legacy_hive_parquet_utc_timestamps, чтобы сообщить Impala, чтобы сделать преобразование при чтении. Дополнительную информацию см. В разделе TIMESTAMP documentation.

This blog post имеет краткое описание проблемы:

Когда ульи сохраняют значение временной метки в формат паркетного, он преобразует местное время в время UTC, а когда он считывает данные, оно преобразует обратно в местное время , Тем не менее Impala, однако, не конвертирует, когда считывает поле timestamp, поэтому время UTC возвращается вместо местного времени.

флаг

impalad говорит Impala, чтобы сделать преобразование при чтении меток времени в Паркетные произведенные Улей. Это повлечет за собой небольшую стоимость, поэтому вам следует подумать о написании временных меток с Impala, если это проблема для вас (хотя это, вероятно, минимально).

+0

Это фантастический ответ. Спасибо Мэтту! –

2

На соответствующую записку, в улей v1.2, вы можете также отключить поведение преобразования часовых поясов с этим флагом:

hive.parquet.timestamp.skip.conversion 

"Текущий Hive реализация паркетных магазинов метки времени в формате UTC, этот флаг позволяет пропуск преобразования на чтение паркетным файлов из других инструментов. "

Это было добавлено в качестве части https://issues.apache.org/jira/browse/HIVE-9482

Наконец, не часовой пояс точно, но с ompatibility Spark (v1.3 и выше) и Impala на Паркетные файлов, там этот флаг:

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