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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

​left join 和 left semi join区别 ​

發布時間:2023/12/20 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ​left join 和 left semi join区别 ​ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

左連接與+號, 就是左邊的表數據都要。??

select * from a,b where a.id=b.id(+);? ? ??

(+)寫在where后面,不能與or/in連用,ui

?select * from a left join b on a.id=b.id;? ? a里面的數據在b里面沒有也要的

?left join 和 left semi join區別 ? :

left join? A表記錄全部有,如果B表多行的話,A數據就被重復了一次。?

left semi join不重復,找到第一條就返回A行記錄,如果找不到A行記錄不顯示。 就是exists或者 in的意思。

?

1、聯系

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

2、區別

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

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

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

最后的結果是這會造成性能,以及 join 結果上的差異。

(4)left semi join?中最后 select 的結果只許出現左表,因為右表只有 join key 參與關聯計算了,而 join on 默認是整個關系模型都參與計算了。

3、兩種 join 的“坑”

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

寫法一: left semi join

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

select

????????a.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_alipay

????????from?tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a

?????left?semi?join

?????tmall_data_fdi_dim_main_auc b

?????on?(a.level2 = b.cat_id2

?????????and?a.brand_id = b.brand_id

?????????and?b.cat_id2 > 0

?????????and?b.brand_id > 0

?????????and?b.max_price = 0

?????)

結果是 3121 條

寫法二: join on

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

select

????????a.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_alipay

????????from?tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a

?????join???tmall_data_fdi_dim_main_auc b

?????on?(a.level2 = b.cat_id2

?????????and?a.brand_id = b.brand_id)

??where??b.cat_id2 > 0

?????????and?b.brand_id > 0

?????????and?b.max_price = 0

  

結果是 3142?條

由于子表(tmall_data_fdi_dim_main_auc)中存在重復的數據,當使用JOIN ON的時候,A,B表會關聯出兩條記錄,應為ON上的條件符合;?
而是用LEFT SEMI JOIN 當A表中的記錄,在B表上產生符合條件之后就返回,不會再繼續查找B表記錄了,所以如果B表有重復,也不會產生重復的多條記錄。 如果B中沒有A也沒有哦

大多數情況下 JOIN ON 和 left semi on 是對等的,但是在上述情況下會出現重復記錄,導致結果差異,所以大家在使用的時候最好能了解這兩種方式的原理,避免掉“坑”。

總結

以上是生活随笔為你收集整理的​left join 和 left semi join区别 ​的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。