2011-09-25 72 views
16

我運行蜂房071,處理現有數據是具有下列目錄佈局:
-TableName
- d =(例如2011-08-01)
- d = 2011-08-02
- d = 2011-08-03

...等
在每個日期下我有日期文件。
立即加載我使用蜂巢:動態分區添加到外部表

CREATE EXTERNAL TABLE table_name (i int) 
PARTITIONED BY (date String) 
LOCATION '${hiveconf:basepath}/TableName';** 

我想我的蜂巢腳本能夠根據一些輸入日期裝入相關的分區天的數據,和數量。所以如果我通過日期= '2011-08-03'天= '7'
腳本應該加載以下分區 - d = 2011-08-03
- d = 2011-08 -04
- d = 2011-08-05
- d = 2011-08-06
- d = 2011-08-07
- d = 2011-08-08
- d = 2011-08 -09

我沒有帶發現的任何discent方式做到這一點前CEPT explicitlly運行:

ALTER TABLE table_name ADD PARTITION (d='2011-08-03'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-04'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-05'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-06'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-07'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-08'); 
ALTER TABLE table_name ADD PARTITION (d='2011-08-09'); 

,然後運行我的查詢

select count(1) from table_name; 

然而這offcourse不按照日期和天數輸入

自動化有什麼辦法,我可以定義到外部表根據日期範圍或日期算術加載分區?

+0

你好!你能解決這個問題嗎?如果是這樣,你能分享你的解決方案嗎?謝謝!! – eli

+0

正在與亞馬遜EMR合作。它認爲亞馬遜實施了以下命令:「alter table X recover partitions」,它將所有子目錄添加爲分區。這部分解決了這個問題,使用「where d> start和d Tomer

+0

謝謝。我希望避免不得不恢復分區,因爲它需要一段時間。 – eli

回答

0

分區是數據的物理分段 - 分區由目錄系統維護,查詢使用元數據來確定分區的位置。所以如果你可以使目錄結構與查詢匹配,它應該找到你想要的數據。例如:

select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09'); 

但我不知道任何日期範圍操作,否則,您必須先執行數學運算來創建查詢模式。

你也可以創建外部表,並添加定義位置分區給他們。 這允許您根據需要碎化數據,並仍然使用分區方案優化查詢。

-1

我在我的博客中解釋了類似的情況:

1)您需要設置屬性:

SET hive.exec.dynamic.partition=true; 
SET hive.exec.dynamic.partition.mode=nonstrict; 

2)創建一個外部臨時表中加載輸入文件數據到這個表。

3)創建主要生產外部表「production_order」與日期字段作爲分配列之一。

4)從臨時表中加載生產表,以便數據自動分配到分區中。

在下面的博客文章中解釋了類似的概念。如果你想看到代碼。

http://exploredatascience.blogspot.in/2014/06/dynamic-partitioning-with-hive.html

+0

這可能是使用生產用例分段的最差實現。他們在那裏是爲了一個目的。不要搞亂數據庫 –

0

我不相信有任何內置的這蜂巢功能。你可以寫一個插件。 Creating custom UDFs

可能不需要提及這一點,但是你有沒有考慮過一個簡單的bash腳本,它會把你的參數和管道命令配置成蜂巢?

Oozie工作流程將是另一種選擇,但這可能是矯枉過正。 Oozie Hive Extension - 經過一番思考,我不認爲Oozie會爲此工作。

6

我有一個非常類似的問題,在遷移後,我不得不重新創建一個我擁有數據但不包含元數據的表。解決方案似乎是在重新創建表之後:

MSCK REPAIR TABLE table_name;

Explained here

這還提到,OP對自己的崗位評價的"alter table X recover partitions"MSCK REPAIR TABLE table_name;適用於非Amazon-EMR實現(我的情況是Cloudera)。

+0

謝謝你的洞察力。 :) –