2013-10-02 52 views
1

我有一些日誌數據,有場在HIVE中,分區列不是基礎保存數據的一部分?

  1. ID,tdate,資訊

我創建了一個動態的分區表

CREATE TABLE log_partitioned(id STRING, info STRING) 
PARTITIONED BY (tdate STRING) 

,然後我加載數據

FROM logs lg 
INSERT OVERWRITE TABLE log_partitioned PARTITION(tdate) 
SELECT lg.id, lg.info, lg.tdate 
DISTRIBUTE BY tdate; 

它成功加載數據通過動態分區。但是當我試圖看看數據在

hdfs dfs -cat /user/hive/warehouse/log_partitioned/tdate=2000-11-05/part-r-00000 

只有兩列的值在那裏。

  • ID1,INFO1

  • ID2,INFO2 ....

如果我們運行蜂巢查詢

select * from log_partitioned limit 10 

它顯示了所有三列。我應該怎麼做該配置單元還將分區列存儲在底層數據中?

+0

爲什麼你在意Hive如何在內部存儲數據? – Olaf

回答

2

我相當確定配置單元默認情況下根本不會這樣做。您可以使用自定義SerDe和/或Input/OutputFormat來完成它,但這可能會很棘手。問題是任何人都可以將數據放入這些分區文件夾中,並且如果他們將數據包含該列的錯誤值,Hive會如何協調該數據?

這是什麼情況?如果你正在做的是你正在談論的dfs -cat命令,那麼從你傳遞的路徑看,是不是很明顯?如果你真的想在一個shell命令的輸出,則是這樣的:

dfs -cat /foo/bar/tdate=2000-11-05/part-r-00000 | sed -e 's/$/ 2000-11-05/' 

另一個可能的方法是將相同的數據存儲在表中的兩列。像這樣:

CREATE TABLE log_partitioned(id STRING, info STRING, tdate_1 STRING) 
PARTITIONED BY (tdate_2 STRING); 

FROM logs lg 
INSERT OVERWRITE TABLE log_partitioned PARTITION(tdate) 
SELECT lg.id, lg.info, lg.tdate as tdate_1, lg.tdate as tdate_2 
DISTRIBUTE BY tdate_2; 
+0

謝謝,我將此配置單元表的輸出用於其他自定義mapreduce作業。 – rajnish