2021-06-15-Hive-25(spark中的join)

spark中的join策略 大概可以分為三種,shuffle join 和broadcast join 非常常見,這是介紹一下桶join(hash join)

1.shuffle join (Common Join)
2.broadcast join
3.bucket map join

1) set hive.optimize.bucketmapjoin = true;
2) 一個表的bucket數(shù)是另一個表bucket數(shù)的整數(shù)倍
3) bucket列 == join列
4) 必須是應(yīng)用在map join的場景中
5)如果表不是bucket的,只是做普通join

4.Sort-Merge-Bucket

1)
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
2) 小表的bucket數(shù)=大表bucket數(shù)
3) Bucket 列 == Join 列 == sort 列
4) 必須是應(yīng)用在bucket mapjoin 的場景中

創(chuàng)建桶和hash桶數(shù)量,這里為4
CREATE TABLE bucketed_user (id INT) name STRING) 
CLUSTERED BY (id) INTO 4 BUCKETS; 

兩個表join的時候,小表不足以放到內(nèi)存中,但是又想用map side join這個時候就要用到bucket Map join。其方法是兩個join表在join key上都做hash bucket,并且把你打算復(fù)制的那個(相對)小表的bucket數(shù)設(shè)置為大表的倍數(shù)。這樣數(shù)據(jù)就會按照join key做hash bucket。小表依然復(fù)制到所有節(jié)點(diǎn),Map join的時候,小表的每一組bucket加載成hashtable,與對應(yīng)的一個大表bucket做局部join,這樣每次只需要加載部分hashtable就可以了

注意
hive并不檢查兩個join的表是否已經(jīng)做好bucket且sorted,需要用戶自己去保證join的表,否則可能數(shù)據(jù)不正確。有兩個辦法
1)hive.enforce.sorting 設(shè)置為true
2)手動生成符合條件的數(shù)據(jù),通過在sql中用distributed c1 sort by c1 或者 cluster by c1
表創(chuàng)建時必須是CLUSTERED且SORTED,如下
create table test_smb_2(mid string,age_id string)
CLUSTERED BY(mid) SORTED BY(mid) INTO 500 BUCKETS

https://cwiki.apache.org/confluence/download/attachments/27362054/Hive+Summit+2011-join.pdf

5.hive sql中的group by & Distribute by & partition by & cluster by & partitioned by & clustered by

group by & partition by & Distribute by 首先一定要記住group by分組之后是會組內(nèi)聚合的而后兩者僅僅是分組了,并未有聚合操作

partition by是分區(qū) Distribute by 可以理解為分簇
partition by是分區(qū) 區(qū)內(nèi)排序用order by
Distribute by 可以理解為分簇 簇內(nèi)排序用sort by 另外當(dāng) distribute by 和 sort by 后的字段相同時,可以使用 cluster by 方式

partitioned by (分區(qū)名 string) 按所分區(qū)名分區(qū)建表使用
clustered by(列名) 按列分桶建表使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容