Hive的三種Join方式

2021-10-24 02:53:33 字數 4006 閱讀 6747

reduce join在hive中也叫common join或shuffle join

如果兩邊資料量都很大,它會進行把相同key的value合在一起,正好符合我們在sql中的join,然後再去組合,如圖所示。

1) 大小表連線:

如果一張表的資料很大,另外一張表很少(<1000行),那麼我們可以將資料量少的那張表放到記憶體裡面,在map端做join。

hive支援map join,用法如下:

select

/*+ mapjoin(time_dim) */

count(1

)from

store_sales join time_dim on

(ss_sold_time_sk = t_time_sk)

2) 需要做不等值join操作(a.x < b.y 或者 a.x like b.y等)

這種操作如果直接使用join的話語法不支援不等於操作,hive語法解析會直接丟擲錯誤

如果把不等於寫到where裡會造成笛卡爾積,資料異常增大,速度會很慢。甚至會任務無法跑成功~

根據mapjoin的計算原理,mapjoin會把小表全部讀入記憶體中,在map階段直接拿另外乙個表的資料和記憶體中表資料做匹配。這種情況下即使笛卡爾積也不會對任務執行速度造成太大的效率影響。

而且hive的where條件本身就是在map階段進行的操作,所以在where裡寫入不等值比對的話,也不會造成額外負擔。

select

/*+ mapjoin(a) */

a.start_level, b.

*from dim_level a

join

(select

*from test) b

where b.xx>=a.start_level and b.xx

3) mapjoin 結合 unionall

原始sql:

select 

a.*,coalesce

(c.categoryid,』na』)

from

(select

*from t_aa_pvid_ctr_hour_js_mes1

) aleft

outer

join

(select

*from t_qd_cmfu_book_info_mes

) c

速度很慢,老辦法,先查下資料分布:

select

*from

(select

count(1

) cnt

from t_aa_pvid_ctr_hour_js_mes1

group

) torder

by cnt desc

limit

50;

資料分布如下:

na      617370129

2118293314

140673814

d 20151236

b 1846306

s 1124246

5675240

8642231

6611104

t 596973

4579473

3489516

7475999

9373395

107580

10508

select 

a.*,coalesce

(c.categoryid,』na』)

from

(select

*from t_aa_pvid_ctr_hour_js_mes1

int)

>

9) a

left

outer

join

(select

*from t_qd_cmfu_book_info_mes

where cast(book_id as

int)

>

9) c

union

allselect

/*+ mapjoin(c)*/a.*

,coalesce

(c.categoryid,』na』)

from

(select

*from t_aa_pvid_ctr_hour_js_mes1

where

coalesce

int),-

999)

<=

9) a

left

outer

join

(select

*from t_qd_cmfu_book_info_mes

where cast(book_id as

int)

<=

9

設定:

當然也可以讓hive自動識別,把join變成合適的map join如下所示

注:當設定為true的時候,hive會自動獲取兩張表的資料,判定哪個是小表,然後放在記憶體中

set hive.auto.

convert

.join

=true

;select

count(*

)from store_sales join time_dim on

(ss_sold_time_sk = t_time_sk)

場景:

大表對小表應該使用mapjoin,但是如果是大表對大表,如果進行shuffle,那就要人命了啊,第乙個慢不用說,第二個容易出異常,既然是兩個表進行join,肯定有相同的字段吧。

tb_a -

5億(按排序分成五份,每份1億放在指定的數值範圍內,類似於分割槽表)

a_id

100001

~110000

- bucket-

01-a -

1億110001

~120000

120001

~130000

130001

~140000

140001

~150000

tb_b -

5億(同上,同乙個桶只能和對應的桶內資料做join)

b_id

100001

~110000

- bucket-

01-b -

1億110001

~120000

120001

~130000

130001

~140000

140001

~150000

注:實際生產環境中,一天的資料可能有50g(舉例子可以把資料弄大點,比如說10億分成1000個bucket)。

原理:在執行smb join的時候會重新建立兩張表,當然這是在後台預設做的,不需要使用者主動去建立,如下所示:

設定(預設是false):

set hive.auto.

convert

.sortmerge.

join

=true

set hive.

optimize

.bucketmapjoin=

true

;set hive.

optimize

.bucketmapjoin.sortedmerge=

true

;

總結:

其實在寫程式的時候,我們就可以知道哪些是大表哪些是小表,注意調優。

Hive的三種Join方式

reduce join在hive中也叫common join或shuffle join 如果兩邊資料量都很大,它會進行把相同key的value合在一起,正好符合我們在sql中的join,然後再去組合,如圖所示。1 大小表連線 如果一張表的資料很大,另外一張表很少 1000行 那麼我們可以將資料量少的...

Hive的三種Join方式

hive reduce join在hive中也叫common join或shuffle join 如果兩邊資料量都很大,它會進行把相同key的value合在一起,正好符合我們在sql中的join,然後再去組合,如圖所示。1 大小表連線 如果一張表的資料很大,另外一張表很少 1000行 那麼我們可以將...

Hive中join的三種方式

hive在實際的應用過程中,大部份分情況都會涉及到不同的 的連線,例如在進行兩個table的join的時候,利用mr的思想會消耗大量的記憶體,良妃磁碟的io,大幅度的影響效能,因為shuffle真的好令人擔心啊,總之,就是各種問題都是由他產生的。下面介紹一下涉及hive在join的時候的優化方式 第...