Hive實現的默認MapReduce連接算法是什麼?它是一個地圖端加入,減少端,廣播加入等?Apache Hive使用的默認MapReduce連接是什麼?
它不是在原來的文件規定,也沒有對蜂巢維基聯接:
http://cs.brown.edu/courses/cs227/papers/hive.pdf
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
Hive實現的默認MapReduce連接算法是什麼?它是一個地圖端加入,減少端,廣播加入等?Apache Hive使用的默認MapReduce連接是什麼?
它不是在原來的文件規定,也沒有對蜂巢維基聯接:
http://cs.brown.edu/courses/cs227/papers/hive.pdf
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
「默認」連接將是洗牌連接,又名。作爲共同連接。請參閱JoinOperator.java。它依靠M/R shuffle來分割數據,並在Reduce端完成連接。正如洗牌過程中的數據大小複製一樣,速度很慢。
更好的選擇是MapJoin,請參閱MapJoinOpertator.java。如果你只有一個大表和一個或多個小表加入(例如,典型的星型模式),這將起作用。首先掃描小表,然後構建散列表並將其上載到HDFS緩存中,然後啓動M/R作業,只需要拆分一個表(大表)即可。比shuffle join更高效,但要求小表適合M/R map任務的內存。通常Hive(至少從0.11開始)會嘗試使用MapJoin,但它取決於你的配置。
專門的連接是bucket-sort-merge連接,又名。 SMBJoin,參見SMBJoinOperator.java。如果您有兩個大表匹配連接鍵上的bucketing,則此功能可用。然後可以安排M/R作業拆分,以便地圖任務觸發器僅拆分形成保證在連接鍵上重疊的兩個大表,以便地圖任務可以使用散列表執行連接。
還有更多的細節,如傾斜連接支持和內存不足條件下的回退,但這可能會讓您開始調查您的需求。
關於連接主題的非常好的演示文稿是Join Strategies in Hive。請記住,事情發展迅速,從2011年的一個呈現是有點過時。
謝謝。和我想的一樣。如果其中一個表很小,那麼只能在地圖一側完成連接(MapJoin)。但是,我的表格非常大(1 TB +),無法使用MapJoin。因此,我假設我的查詢使用了通用連接(Reduce-side連接)。 – Ace
請在蜂巢查詢的explain,你可以看到執行計劃。
哪個Hive版本?在哪種配置下(例如'hive.auto.convert.join'是true還是false?) –
Hive 0.12.0。 hive.auto.convert.join設置爲true。 – Ace