2017-10-21 217 views
0

我想這是很容易...Hive/SparkSQL:如何將Unix時間戳轉換爲時間戳(不是字符串)?

在蜂巢/ SparkSQL,我該如何轉換unix時間戳[注1]爲timestamp 數據類型?

(注1:也就是說,自1970年1月1日秒/分的毫秒數)

我想from_unixtime()會做到這一點,但它給回一個字符串 ,而不是一個時間戳。以下實驗說明了該問題

步驟0:製備

select 
    from_unixtime(1508673584) as fut; 

結果:

----------------------- 
| fut     | 
| ------------------- | 
| 2017-10-22 11:59:44 | 
----------------------- 

步驟1:創建與的結果的表from_unixtime()

create table test 
select 
    from_unixtime(1508673584) as fut; 

步驟2:檢查所述列的數據類型fut

describe test; 

結果:

---------------------------------- 
| col_name | data_type | comment | 
| -------- | --------- | ------- | 
| fut  | string | <null> | 
---------------------------------- 

我也嘗試這個

select 
    from_utc_timestamp(1508618794*1000, 'EDT'); 

根據手冊(鏈路here),這應該工作。因爲它 指出:

覆羽在UTC時間戳*給定的時區(如蜂房0.8.0的)。 * timestamp是一個基本類型,包括時間戳/日期, tinyint/smallint/int/bigint,float/double和decimal。分數 值被視爲秒。整數值被認爲是 毫秒。例如from_utc_timestamp(2592000.0,'PST'), from_utc_timestamp(2592000000,'PST')和from_utc_timestamp(時間戳 '1970-01-30 16:00:00','PST')所有返回的時間戳一九七○年一月三十日 08:00:00

不過,我得到的

Error: org.apache.spark.sql.AnalysisException: 
    cannot resolve 'from_utc_timestamp((1508618794 * 1000), 'EDT')' 
    due to data type mismatch: 
    argument 1 requires timestamp type, 
    however, '(1508618794 * 1000)' is of int type.; line 2 pos 2; 
'Project [unresolvedalias(from_utc_timestamp((1508618794 * 1000), EDT), None)] 
+- OneRowRelation$ 

SQLState: null 
ErrorCode: 0  

回答

1

錯誤(我在這裏提供一個答案自己。)

的答案是使用cast()。這既適用於datetimestamp

select 
    from_unixtime(1508673584)     as fut, 
    cast(from_unixtime(1508673584) as date)  as futAsDate, 
    cast(from_unixtime(1508673584) as timestamp) as futAsTimestamp; 

結果:

------------------------------------------------------------ 
| fut     | futAsDate | futAsTimestamp  | 
| ------------------- | ---------- | --------------------- | 
| 2017-10-22 11:59:44 | 2017-10-22 | 2017-10-22 11:59:44.0 | 
------------------------------------------------------------ 

驗證數據類型

create table test2 
select 
    from_unixtime(1508673584)     as fut, 
    cast(from_unixtime(1508673584) as date)  as futAsDate, 
    cast(from_unixtime(1508673584) as timestamp) as futAsTimestamp; 

然後

describe test2; 

結果:

---------------------------------------- 
| col_name  | data_type | comment | 
| -------------- | --------- | ------- | 
| fut   | string | <null> | 
| futAsDate  | date  | <null> | 
| futAsTimestamp | timestamp | <null> | 
---------------------------------------- 
1

創建表測試AS 選擇流延(FROM_UNIXTIME(1508673584)的時間戳)作爲FUT;