2017-06-23 38 views
0

我有以下格式的行,然後我想將其轉換爲有效的Hive時間戳。格式在我的數據:使用第一個unix_timestamp轉換列中的每一行

28/04/2017 00:00:00|20550|22/05/2017 00:00:00| 

我只在第一和第三列有興趣,有|分隔,在我的情況的格式,然後:

dd/MM/yy HH:mm:ss 

我發現這可以在Hive中不會用作時間戳。

我發現自己無法使用類似的查詢轉換所有的第一和第三列到正確的格式:

select from_unixtime(unix_timestamp('28/04/2017','dd/MM/yy HH:mm:ss'),'yyyy-MM-dd') from `20170428_f_pers_pers` 

我想該查詢的不同情況,但因爲我不能訪問文檔(互聯網是在這裏工作的上限),我看不出如何正確使用此兩項功能,from_unixtimeunix_timestamp

我做出以下假設:

  1. 我可以對日期和年份重新排序。如果這不是真的,我不知道如何將我的原始數據轉換爲適當的Hive格式
  2. 當我這樣做時,它會影響整個列。進一步說,成功完成後,我應該能夠將整列的格式從字符串更改爲時間戳(也許我必須爲此創建一個新列,不確定)

我不在乎這兩個列一次,但現在當我查詢顯示首先我得到儘可能多的空值,因爲數據有我的表,並且我不確定我的假設甚至是部分正確的,因爲我遇到的每個示例都更簡單(它們不會更改例如幾天和幾年)。

我想知道如何將查詢應用到一個特定的列,因爲我還沒有理解如何從迄今爲止研究的例子中做到這一點。我沒有看到他們使用任何類型的列ID,這對我來說很奇怪,使用列中的數據來更改列本身。

在此先感謝。

編輯:我現在想的東西像

select from_unixtime(unix_timestamp(f_Date, 'dd/MM/yyyy HH:mm:ss')) from `myTable` 

但我從HUE收到以下錯誤:

Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 

回答

1

格式應該由輸入字符串完全覆蓋。
換句話說 -
格式的長度可以等於輸入字符串的長度或更短,但不能更長。

28/04/2017 00:00:00 
||||||||||||||||||| 
dd/MM/yyyy HH:mm:ss 

select from_unixtime(to_unix_timestamp('28/04/2017 00:00:00', 'dd/MM/yyyy HH:mm:ss')) 

2017-04-28 00:00:00


28/04/2017 00:00:00 
|||||||||| 
dd/MM/yyyy 

select from_unixtime(to_unix_timestamp('28/04/2017 00:00:00', 'dd/MM/yyyy')) 

2017-04-28 00:00:00


結果可以從字符串轉換使用cast

select cast (from_unixtime(to_unix_timestamp('28/04/2017 00:00:00', 'dd/MM/yyyy HH:mm:ss')) as timestamp) 
+0

我看看......是否可以申請該查詢列中的所有數據,時間戳?這個想法最後有數據作爲時間戳,這是可能的嗎?也許這就是爲什麼查詢不能讓我失望 –

+0

這對我來說非常有幫助,因爲我一直在尋找投射方式。但是,如果不是隻有一行,我有2000,是否可以將該操作應用於整列?例如,如果'28/04/2017 00:00:00'列在「日期」列中,那麼您如何才能將此操作應用到該列中的每一行?可能嗎? –

+1

超越它是可能的。標量函數適用於表達式。爲什麼硬編碼表達式和列名稱之間會有區別?爲什麼查詢2000行的表與查詢單個表的「表」有什麼區別? –

相關問題