2016-03-08 32 views
0

我在Hive中創建表格,運行映射器轉換並保存表格。我想根據何時運行Hive查詢來對錶進行分區。由unix時間戳記組成的Hive動態分區

我創建表:

CREATE EXTERNAL TABLE IF NOT EXISTS testtable (
    test_test STRING 
) PARTITIONED BY (time STRING) 
LOCATION 'loc/table' 
; 

然後運行轉換並保存表,而試圖這樣:

FROM (
MAP 
one.test_test 
USING 
'python job.py' 
AS test1 
FROM 
one 
) test_step 
INSERT OVERWRITE TABLE testtable PARTITION (time=unix_timestamp()) 
SELECT CAST (test_step.test1 AS STRING) AS test_test 
; 

然而,當我做

時間= UNIX_TIMESTAMP ()

,我得到一個異常。我會如何去做這件事?

感謝

+0

你希望通過這種分區形式獲得什麼? –

回答

2

我覺得如果你使用動態分區(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-DynamicPartitionInserts)它應該工作。分區字段只是表中的另一列,所以如果您的查詢中的列有值,則Hive會自動將其放入正確的分區。因此,您的發言會是這個樣子

FROM (
MAP 
one.test_test 
USING 
'python job.py' 
AS test1 
FROM 
one 
) test_step 
INSERT OVERWRITE TABLE testtable PARTITION (time) 
SELECT CAST (test_step.test1 AS STRING) AS test_test, 
unix_timestamp() as time 
; 

做它像這可能雖然創造了很多分區,作爲UNIX_TIMESTAMP的值()查詢的執行過程中會發生變化。最好使用額外的語句先創建分區,然後再插入。

編輯:事先添加一個分區,你需要設置你想要的時間戳,例如,腳本的參數。然後

ALTER TABLE testtable ADD PARTITION (time=your_timestamp_here); 

這將您原來的查詢之前去你更換UNIX_TIMESTAMP()與your_timestamp_here(當然這將是一個有效的UNIX時間戳)。

+0

當我從變換查詢開始時,對於該行的所有條目,時間戳是否相同?你說的另一種方式是什麼?我將如何創建一個分區並添加所有項目? – intl

+0

我認爲每行都會調用unix_timestamp(),但我並不是100%確定的,你可能想用limit 1000來嘗試,然後使用show partitions來查看它創建的內容。 – LiMuBei

+0

如果您手動設置時間戳,則可能甚至不需要「添加分區」,例如, '123456 as time'。 – LiMuBei