1.問題描述php
Hive表中存儲的Timestamp類型的字段顯示日期與Impala中查詢出來的日期不一致。html
2.問題復現apache
1.建立一個簡單的測試表函數
2.向表中插入一條測試數據測試
insert into date_test4 values(1,'1503751615','2017-08-26 08:46:55');
獲取當前系統時間存入表中:ui
3.經過Hive查詢時間顯示以下3d
select id,create_date_str,from_unixtime(create_date) from date_test4;
4.經過Impala查詢時間顯示以下unix
select id,create_date_str,cast(create_date as timestamp) from date_test4;
能夠看到經過Hive查詢看到的時間與經過Impala查詢看到的時間不一致;code
3.問題分析orm
3.1Hive的from_unixtime
Hive官網from_unixtime函數說明:
Return Type | Name(Signature) | Description |
---|---|---|
string | from_unixtime(bigint unixtime, string format) | Converts the number of seconds from unix epoch (1970-01-01 00:00:00 UTC) to a string representing the timestamp of that moment in the current system time zone in the format of "1970-01-01 00:00:00". |
在Hive中經過from_unixtime函數將TIMESTAMP時間戳轉換成當前時區的日期格式的字符串,默認格式爲「yyyy-MM-dd HH:mm:ss」,因此Hive在查詢的時候能正確的將存入的時間戳轉成當前時區的時間;
3.2Impala的TIMESTAMP
默認狀況下,Impala不會使用本地時區存儲時間戳,以免意外的時區問題形成沒必要要的問題,時間戳均是使用UTC進行存儲和解釋。具體說明請參考官方文檔:
http://impala.apache.org/docs/build/html/topics/impala_timestamp.html#timestamp
4.解決方法
使用Impala的from_utc_timestamp函數指定時區進行時間轉換,事例以下:
select id,create_date_str, cast(create_date as timestamp),from_utc_timestamp(cast(create_date as timestamp), 'EDT') from date_test4;
指定時區後時間與原始Hive中顯示時間一致,時區查看參考以下地址:
http://zh.thetimenow.com/time-zones-abbreviations.php
醉酒鞭名馬,少年多浮誇! 嶺南浣溪沙,嘔吐酒肆下!摯友不願放,數據玩的花!