0014-Hive中的Timestamp類型日期與Impala中顯示不一致分析

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

醉酒鞭名馬,少年多浮誇! 嶺南浣溪沙,嘔吐酒肆下!摯友不願放,數據玩的花!

相關文章
相關標籤/搜索