2014-01-06 19 views
2

我應該在蜂巢中創建和刪除中間表嗎?Hive SQL編碼風格:中間表?

我可以寫類似(大大簡化):

drop table if exists tmp1; 
create table tmp1 as 
select a, b, c 
from input1 
where a > 1 and b < 3; 

drop table if exists tmp2; 
create table tmp2 as 
select x, y, z 
from input2 
where x < 6; 

drop table if exists output; 
create table output as 
select x, a, count(*) as count 
from tmp1 join tmp2 on tmp1.c = tmp2.z 
group by tmp1.b; 
drop table tmp1; 
drop table tmp2; 

或者我可以把一切都變成一個聲明:

drop table if exists output; 
create table output as 
select x, a, count(*) as count 
from (select a, b, c 
    from input1 
    where a > 1 and b < 3) t1 
join (select x, y, z 
    from input2 
    where x < 6) t2 
on t1.c = t2.z 
group by t1.b; 

顯然,如果我重複一次以上的中間表,它對創建它們非常有意義。 但是,當他們只用一次,我有一個選擇。

我嘗試都和第二個是6%,如通過壁時間測量更快,但4%如由MapReduce Total cumulative CPU time日誌輸出測量較慢。 這種差異可能在隨機誤差範圍內(由其他進程& c引起)。 但是,組合查詢有可能導致戲劇性的加速嗎?

另一個問題是:是僅使用一次的中間表,是蜂房代碼中的正常情況,還是應該在可能的情況下避免使用?

回答

3

有一個顯着的區別。
運行一個大查詢將允許優化器在優化中更加自由。
在這種情況下最重要的優化之一是在hive.exec.parallel中設置的並列。當設置爲真正的配置單元時會並行執行獨立的階段。
在你的情況下,在第二個查詢想象t1,t2做更復雜的工作,如group by。在第二個查詢t1中,t2將執行simultaniusly,而在第一個腳本中將是串行的。

+0

取代它如何找出一個參數的當前值,如'hive.exec.parallel'? – sds

+0

只需在Hive控制檯中鍵入'set;',就可以得到參數列表及其值。 –

0

正如你所發現的,在時間上可能沒有太大的區別。很可能您希望維護(a)「保存點」/中間回滾或(b)故障排除目的的臨時表。否則,記住(或自動化)中間表的清理/丟棄可能不值得管理工作。

1

我認爲結合查詢是一件好事。它允許Hive查詢優化器來優化查詢。當你運行它Hive'll只啓動一個MapReduce工作

SELECT COUNT(*) FROM (SELECT * FROM clicks WHERE dt = '2014-01-07') t; 

考慮這種愚蠢的查詢。

採用中間表

CREATE TABLE tmp AS SELECT * FROM clicks WHERE dt = '2014-01-07'; 
SELECT COUNT(*) FROM tmp; 

顯然將運行兩個MapReduce作業。

所以要回答你的問題:是的,結合查詢可能會導致加速。

3

我喜歡創建多個視圖,然後只在最後創建一個表。這使得Hive優化器可以減少map-reduce步驟的數量,並且可以像dimamah和Nigel指出的那樣並行執行,但有助於保持非常複雜的管道的可讀性。

對於你的榜樣,您可以用

CREATE VIEW IF NOT EXISTS tmp1_view 
AS 
SELECT a, b, c FROM inputs 
where a > 1 and b < 3; 


create view if not exists tmp2_view as 
select x, y, z_ 
from input2 
where x < 6; 

drop table if exists output; 
create table output as 
select x, a, count(*) as count 
from tmp1_view join tmp2_view on tmp1_view.c = tmp2_view.z 
group by tmp1_view.b; 
+0

「視圖」和「表」之間的區別是什麼? – sds

+0

配置單元視圖描述可以像表一樣訪問的配置單元查詢,但表示該表的輸出。看看我的編輯答案,你可以重寫你的查詢。 –

+0

謝謝;那麼,當配置單元進程退出時視圖會消失嗎? – sds