最近有重新回看了《Hadoop權威指南》,又想起來總結一些博文了,所以針對Hive常Hive數據連接及合併又仔細查了很多資料,寫了這篇文章,還是一樣,感謝各位在網絡上的分享!!!
一.Hive連接:
Hive中的join只支持等值join,在join on中的on後的連接條件只能是“=”,不能是“<”或“>”等符號。並且,on中的等值連接只能是and,不能是or。
Hive中的common join也可稱爲reduce join或shuffle join。
1.內連接([inner] join):
內連接只會返回連接的兩個表中所有符合連接條件的且兩個表內都存在的數據且輸入表之間的每次匹配都會在輸出表中生成一行數據。
可以在連接謂詞中使用and關鍵字分割一系列表達式來連接多個列,還可以在查詢中使用多個join...on...子句連接多個表(Hive會智能地以最少的MapReduce作業數來執行連接)。
單個的連接用一個MapReduce作業實現,多個連接的連接條件中使用了相同的列,平均每個連接可以用少於一個MapReduce作業來實現。
2.外連接(left [outer] join,right [outer] join,full [outer] join):
外連接可以返回連接表中不能匹配的數據行。即使左(右)側表中的有些行無法與所要連接的表中的任何數據行對應,查詢還是會返回這個表中的每一個數據行,並且由於這個表在連接右(左)表中不存在,則在對應列爲空值null,也就是左(右)外連接。同樣的,全外連接是兩個連接表中的所有行在輸出中都有對應的行,即無論左表還是右表,只要是有對應連接中不存在,則會展示爲空值null。
3.半連接(semi join):
對於common join而言,由於是在reduce端進行數據連接操作,則會極大消耗資源,所以在map端過濾掉一部分不需要參與join操作的數據。
left semi join:
在寫left semi join時必須遵循的限制是右表只能在on子句中出現,即在where子句或select子句中設置過濾條件或查詢條件都是不可以的。並且在使用left semi join時,遇到右表的重複數據,座標會跳過,而common join on會紙質遍歷。left semi join的查詢結果數據只可能出現左側表的數據,因爲上述限制和實際上右側表只參與了條件判斷。
4.map連接(map join):
如果有一個連接表小到足以放入內存,Hive就可以把較小的表放在每個mapper的內存中進行連接操作。
common join和map join的區別及原因:
在common join中的map階段,map端輸出的key爲join的條件,map輸出的value爲查詢出來的字段信息。
在common join中的shuffle階段,將map端輸出的key進行hash,並且根據對應的hash值分配不同的reducer。
在common join中的reduce階段,完成join操作。
執行map join查詢時不需要使用reducer,會首先將小錶轉化並以HashTable文件形式存入緩存中。而後在map端只需要掃描大表中的每一行數據,而後每一行數據在緩存中與小表數據進行關聯,而後直接輸出結果。
原因:在MapReduce執行過程中shuffle階段是非常耗費資源和時間的,此外由於排序的原因,可能會出現單個reduce處理單個key對應的極大的數據量的情況,即數據傾斜。
二.Hive合併:
union用於合併多個select的結果查詢,必須保證select中字段一致,且每個select語句返回的數量和名字必須一樣。
單獨使用union會對兩個結果集進行並集操作,不包括重複行。
使用union all同樣會對兩個結果集進行並集操作,但是包括重複行。