日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

转载:left join和left semi join的联系和区别

發(fā)布時(shí)間:2025/4/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载:left join和left semi join的联系和区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、聯(lián)系

他們都是 hive join 方式的一種,join on 屬于 common join(shuffle join/reduce join),而?left semi join 則屬于 map join(broadcast join)的一種變體,從名字可以看出他們的實(shí)現(xiàn)原理有差異。

2、區(qū)別

(1)Semi Join,也叫半連接,是從分布式數(shù)據(jù)庫(kù)中借鑒過來的方法。它的產(chǎn)生動(dòng)機(jī)是:對(duì)于reduce side join,跨機(jī)器的數(shù)據(jù)傳輸量非常大,這成了join操作的一個(gè)瓶頸,如果能夠在map端過濾掉不會(huì)參加join操作的數(shù)據(jù),則可以大大節(jié)省網(wǎng)絡(luò)IO,提升執(zhí)行效率。
實(shí)現(xiàn)方法很簡(jiǎn)單:選取一個(gè)小表,假設(shè)是File1,將其參與join的key抽取出來,保存到文件File3中,File3文件一般很小,可以放到內(nèi)存中。在map階段,使用DistributedCache將File3復(fù)制到各個(gè)TaskTracker上,然后將File2中不在File3中的key對(duì)應(yīng)的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同。
由于?hive 中沒有 in/exist 這樣的子句(新版將支持),所以需要將這種類型的子句轉(zhuǎn)成 left semi join。left semi join 是只傳遞表的 join key 給 map 階段 , 如果 key 足夠小還是執(zhí)行 map join, 如果不是則還是 common join。關(guān)于?common join(shuffle join/reduce join)的原理請(qǐng)參考文末 refer。

(2)left semi join?子句中右邊的表只能在?ON 子句中設(shè)置過濾條件,在 WHERE 子句、SELECT 子句或其他地方過濾都不行。

(3)對(duì)待右表中重復(fù)key的處理方式差異:因?yàn)?left semi join 是 in(keySet) 的關(guān)系,遇到右表重復(fù)記錄,左表會(huì)跳過,而 join on 則會(huì)一直遍歷。

最后的結(jié)果是這會(huì)造成性能,以及 join 結(jié)果上的差異。

(4)left semi join?中最后 select 的結(jié)果只許出現(xiàn)左表,因?yàn)橛冶碇挥?join key 參與關(guān)聯(lián)計(jì)算了,而 join on 默認(rèn)是整個(gè)關(guān)系模型都參與計(jì)算了。

3、兩種 join 的“坑”

? 由于HIVE中都是等值連接,在JOIN使用的時(shí)候,有兩種寫法在理論上是可以達(dá)到相同的效果的,但是由于實(shí)際情況的不一樣,子表中數(shù)據(jù)的差異導(dǎo)致結(jié)果也不太一樣。?

寫法一: left semi join

selecta.bucket_id,a.search_type,a.level1,a.name1,a.level2,a.name2,cast((a.alipay_fee) as double) as zhuliu_alipay,cast(0 as double) as total_alipayfrom tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 aleft semi jointmall_data_fdi_dim_main_auc bon (a.level2 = b.cat_id2and a.brand_id = b.brand_idand b.cat_id2 > 0and b.brand_id > 0and b.max_price = 0)

?

結(jié)果是 3121 條

寫法二: join on

selecta.bucket_id,a.search_type,a.level1,a.name1,a.level2,a.name2,cast((a.alipay_fee) as double) as zhuliu_alipay,cast(0 as double) as total_alipayfrom tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 ajoin tmall_data_fdi_dim_main_auc bon (a.level2 = b.cat_id2and a.brand_id = b.brand_id)where b.cat_id2 > 0and b.brand_id > 0and b.max_price = 0

結(jié)果是 3142?條

這兩種寫法帶來的值居然不是相等的,我一直以為理解這兩種方式的寫法是一樣的,?但是統(tǒng)計(jì)的結(jié)果卻是不一樣的。?
經(jīng)過一層一層的查找,發(fā)現(xiàn)是由于子表(tmall_data_fdi_dim_main_auc)中存在重復(fù)的數(shù)據(jù),當(dāng)使用JOIN ON的時(shí)候,A,B表會(huì)關(guān)聯(lián)出兩條記錄,應(yīng)為ON上的條件符合;?
而是用LEFT SEMI JOIN 當(dāng)A表中的記錄,在B表上產(chǎn)生符合條件之后就返回,不會(huì)再繼續(xù)查找B表記錄了,所以如果B表有重復(fù),也不會(huì)產(chǎn)生重復(fù)的多條記錄。?

大多數(shù)情況下 JOIN ON 和 left semi on 是對(duì)等的,但是在上述情況下會(huì)出現(xiàn)重復(fù)記錄,導(dǎo)致結(jié)果差異,所以大家在使用的時(shí)候最好能了解這兩種方式的原理,避免掉“坑”。

轉(zhuǎn)載于:https://www.cnblogs.com/zzhangyuhang/p/9792794.html

總結(jié)

以上是生活随笔為你收集整理的转载:left join和left semi join的联系和区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。