2015-03-13 64 views
1

我已經將Teradata表的數據遷移到配置單元中。多個表加入配置單元

現在我必須在導入的數據之上構建彙總表。彙總表需要從五個源表中構建

如果我要加入連接,我需要連接五個表可以在蜂巢中嗎?或者我應該把查詢分成五部分? 這個問題應該採取什麼明智的做法?

請建議

回答

0

是的,你可以在一個單一的查詢join multiple tables。這爲Hive提供了許多機會,如果您將其分解爲單獨的查詢,則無法完成優化。

+0

由於傑里米鬍子!!我正在考慮如何提高蜂巢連接查詢的性能,最佳做法是以最佳方式進行此類連接 – 2015-03-17 08:37:01

10

蜂巢中的五種方式當然是可能的,並且(自然)可能很慢很慢。

你應該考慮共同分區上

  • 相同的分區列的表
  • 相同的分區數

其他選項包括提示。例如,考慮一個表是大的還是小的。那麼您可以使用streamtble提示

假設很大:從

SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val, d.val, e.val 
FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) join d on (d.key = c.key) join e on (e.key = d.key) 

改編:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

所有5張表格中加入對於表b,c,d和ea的關鍵字的特定值,單個映射/縮減作業和值 在減速器內存中緩衝了 。然後,對於從a檢索到的每個行 ,都會使用緩衝的行計算連接。如果省略了 STREAMTABLE提示,則Hive將流式傳輸 連接中最右邊的表。

另一個提示是mapjoin即在內存中緩存的小表是有用的。

假設一個大且B,C,d,e爲小到足以在每個映射器的存儲器:

SELECT /*+ MAPJOIN(b,c,d,e) */ a.val, b.val, c.val, d.val, e.val 
FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 
join d on (d.key = c.key) join e on (e.key = d.key) 
+0

嘿,謝謝!我正在研究如何改進蜂巢連接查詢的性能 – 2015-03-17 08:34:42

+0

@chhayavishwakarma。是的 - 這個答案提供了這些方法。 – javadba 2017-07-19 13:55:22