本篇講解Hive大表N:N關(guān)聯(lián)的小笛卡爾積+數(shù)據(jù)傾斜的優(yōu)化方法
上一篇SMB Join發(fā)現(xiàn)卡在一個map泊碑,看日志發(fā)現(xiàn)comm_id=102073766數(shù)據(jù)量很大,檢查數(shù)據(jù)分布
comm_id=102073766以外,top20數(shù)據(jù)量都在2500-4000,3873* 3873≈1600w,問題不大,4w*4w=16億 問題很大
我們知道Mapjoin可以解決大笛卡爾積,所以改用SMBjoin+Mapjoin,只將comm_id=102073766 單拎出來做Map join
1.建分桶表
2.插入分桶表(剔除comm_id=102073766)
3.SMB Join
4.comm_id=102073766建A表(利用distubute by, 做160個block)
5.再建一張只有1個block的B表,與A表數(shù)據(jù)相同
6.Map join 將b表廣播到A表160個maptask關(guān)聯(lián)
最后將兩張結(jié)果表union all
代碼太長就不貼了,參數(shù)前兩篇都有胎撤,意思到了就行
本篇總結(jié):SMB Join可以解決小笛卡爾積,但相同的key都會在同一個task中join,無法解決數(shù)據(jù)傾斜凿菩。將數(shù)據(jù)傾斜的key單拎出來做Mapjoin,兩者配合食用, 這樣就可以解決小笛卡爾積+數(shù)據(jù)傾斜Join.