當前位置:成語大全網 - 漢語詞典 - 加入蜂巢遊戲攻略

加入蜂巢遊戲攻略

[目錄]

Join Hive只支持等價連接,也就是說Join on中on的表之間的連接條件只能是=,不能是

配置單元執行引擎將把HQL“翻譯”成壹個映射縮減任務。在執行表的連接操作時,如果多個表中的每個表使用相同的列進行連接(出現在Join on子句中),將只生成壹個MR作業:

A、B、C三個表都使用同壹個字段進行連接,即同壹個字段同時出現在兩個Join子句中,這樣就只生成壹個MR作業。

如果有多個表,其中壹個使用至少2個字段進行連接(Join子句中至少列出了同壹個表中的2個),則至少會生成2個mrjobs:

三個表是基於兩個字段連接的,這兩個字段b.key1和b.key2同時出現在表B中。連接的過程如下:首先基於a.key和b.key1連接A表和B表,對應第壹個MR作業;;表a和b連接結果,然後用c連接,對應第二個MR作業。

這是因為在輸出映射時,Join on條件中的列被用作鍵。如果聯接有多個相關鍵,則這些相關鍵的組合將被用作鍵。Map根據key向Reduce終端分發數據,具體的Join在Reduce操作中完成。因此,如果基於不同的列連接多個表,就不可能在壹輪MR任務中將所有相關的數據放入同壹個Reduce操作中。

Hive支持常用的SQL連接語句,如inner join、left outer join、right join和Hive特有的map side join。地圖端連接是優化Hive連接查詢的重要技巧。

先準備三張桌子。

雇員雇員表:

部門部門表:

薪級表:

當連接多個表時,將只顯示所有表中符合on條件的數據,這類似於交集。

連接運算符左側表中滿足where條件的所有記錄都將被保留。如果連接運算符右側的表中沒有滿足on之後的連接條件的記錄,則從右側表中選擇的列將為NULL。如果沒有where條件,將保留左側表中的所有記錄。

標準查詢關鍵字的執行順序是從->;on->;其中-& gt;分組依據->;有-& gt;Order by,on是在關聯前過濾表,而左關聯只對右表有效,所有左表都要選中。

對於大量數據,在編寫SQL時使用where條件過濾掉不合格的數據是有好處的。但是對於左外連接和右連接,在執行on條件之前,不會執行where條件。on條件將生成壹個臨時表,where條件將過濾這個臨時表。

因此,為了優化Hive SQL執行的效率,在需要外連接的場景下,如果是連接前的條件查詢,查詢應該放在on之後,如果是連接後的篩選,條件應該放在where之後,where條件應該用於篩選主表。

特別需要註意的是,如果在與從表進行左關聯之前需要篩選主表,最好將主表寫成子查詢,這樣可以減少主表的數據量:

與左外連接相反,右外連接將保留連接運算符右側表中滿足where條件的所有記錄。如果連接運算符左側的表中沒有滿足on之後的連接條件的記錄,則從左側的表中選擇的列為NULL。

保留滿足where條件的兩個表的數據,類似於union,用NULL填充不滿足連接條件的字段。

以左半連接關鍵字之前的表為主表,返回主表的鍵也在輔助表中的記錄。在早期版本的Hive中,不支持標準SQL中的IN或EXISTS函數,可以使用左半連接來實現類似的功能。

應該強調的是:

笛卡爾積是壹個連接,它表示左表中的行數乘以右表中的行數。

Hive中的連接可以分為普通連接和映射連接。

如果沒有指定Map Join或者不滿足Map Join的條件,那麽Hive parser會默認執行Common Join,即在Reduce階段完成Join。整個過程包括貼圖、洗牌和還原階段。

以下面的HQL為例來說明它的過程:

地圖連接通常用在壹個非常小的表連接壹個大表的場景中。小表的具體大小由參數hive決定。mapjoin.smalltable.filesize,表示小表的總大小。默認值為2500萬字節,即25M。

在Hive 0.7之前,需要使用hint prompt/+mapjoin(table)/來執行Map Join,否則會執行Common Join,但在0.7版本之後,Map Join會默認自動轉換,由參數hive.auto.convert.join控制,默認值為true。

如上圖流程所示,任務A在客戶端本地執行,負責掃描小表B的數據,轉換成HashTable數據結構,寫入本地文件,然後將文件加載到DistributeCache。

接下來,Task B,也就是壹個沒有Reduce的MR,啟動MapTasks掃描大表A,在MAP階段,根據A的每條記錄,關聯到DistributeCache中表B對應的HashTable,直接輸出結果。

因為MapJoin中沒有Reduce,所以有多少Map任務就有多少結果文件,由Map直接輸出。

Map Join比Common Join效率高,但是總會有不滿足“小表”條件的時候。這需要桶映射連接。

Bucket map join需要將兩個要連接的表在連接字段上劃分成桶(每個桶對應hdfs上的壹個文件),需要時小表的桶數是大表的桶數的倍數。

建立存儲桶表的例子:

這樣my_user表對應32個桶,數據按照哈希值和uid的32進行劃分,然後分配到不同的桶。

如果兩個表在連接字段上被劃分為桶,則可以執行桶映射連接,具體來說:

對於桶映射連接中的兩個表,如果每個桶中的分區字段也是有序的,則還可以執行排序合並桶映射連接。

表格構建語句是:

這樣,當兩個桶要做局部連接時,只需要像歸並排序算法中的歸並操作那樣依次遍歷兩個桶,就可以壹次只讀取小表中的壹部分數據,然後逐行與大表進行匹配。這種join不限制內存大小,也可以進行全外部join。

執行排序合並桶映射連接時,要設置的屬性有:

在加入的過程中,在地圖結束後,同壹個鍵的數據將被混洗到同壹個Reduce中。如果數據均勻分布,每次縮減處理的數據量通常是平衡的。但是如果有明顯的數據偏斜,壹些reducers處理的數據量就會過大,使得這個節點的處理時間過長,成為瓶頸。

大表與大表相關聯。如果其中壹個表大部分是空的或者有更多的零,很容易打亂reduce,導致運行緩慢。

在這種情況下,您可以為異常值分配壹個隨機值來分散鍵,並將其均勻地分配給多個reduce來執行,例如:

當鍵值都是有效值時,解決方案是:

設置以下參數:

Hive在運行時無法判斷哪個鍵會傾斜,所以使用參數hive.skewjoin.key來控制傾斜閾值。如果超過這個值,新值將被發送到那些還沒有達到的reduce,這個值壹般可以設置為要處理的記錄總數reduce數的2-4倍。

1.hive Foundation II(join的原理和機制,join的幾種類型,數據傾斜的簡單處理)

2.Hive:連接和連接優化

3.Hive中常見數據傾斜的處理