hive多個表join Hive的三種Join方式

2021-10-12 16:01:59 字數 2885 閱讀 4881

hive的三種join方式

hive

common/shuffle/reduce join

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

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

map 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:

from (select * from t_aa_pvid_ctr_hour_js_mes1

) aleft outer join

(select * fromt_qd_cmfu_book_info_mes

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

select *

from

fromt_aa_pvid_ctr_hour_js_mes1

order by cnt desc

limit 50;

資料分布如下:

na 617370129

2 118293314

1 40673814

d 20151236

b 1846306

s 1124246

5 675240

8 642231

6 611104

t 596973

4 579473

3 489516

7 475999

9 373395

107580 10508

(select * fromt_aa_pvid_ctr_hour_js_mes1

) aleft outer join

(select * fromt_qd_cmfu_book_info_mes

where cast(book_id asint)>9) c

union all

select /*+ mapjoin(c)*/

(select * fromt_aa_pvid_ctr_hour_js_mes1

left outer join

(select * fromt_qd_cmfu_book_info_mes

where cast(book_id asint)<=9) c

設定:當然也可以讓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)

smb(sort-merge-buket) join

場景:大表對小表應該使用mapjoin,但是如果是大表對大表,如果進行shuffle,那就要人命了啊,第乙個慢不用說,第二個容易出異常,既然是兩個表進行join,肯定有相同的字段吧。tb_a - 5億(按排序分成五份,每份1億放在指定的數值範圍內,類似於分割槽表)

a_id

100001 ~ 110000 - bucket-01-a -1億

110001 ~ 120000

120001 ~ 130000

130001 ~ 140000

140001 ~ 150000tb_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 Hive分桶表

測試資料 95001,李勇,男,20,cs 95002,劉晨,女,19,is 95003,王敏,女,22,ma 95004,張立,男,19,is 95005,男,18,ma 95006,孫慶,男,23,cs 95007,易思玲,女,19,ma 95008,李娜,女,18,cs 95009,夢圓圓,女...

hive外部表指向多個檔案 資料夾

hive建外部表正常指向乙個檔案或者資料夾時很簡單,然而需求是指向兩個不同的資料夾起上級目錄中還有其他檔案不能直接指定上級目錄,特此記錄。新建外部分割槽表 新建外部分割槽表 create external table test content string partitioned by date s...

hive表分割槽

hive對錶有分割槽的功能。hive根據表的列屬性值 諸如日期,城市 部門對錶進行分割槽 使用分割槽,能夠很容易查詢 到資料的一部分。表或分割槽被分為 buckets 桶 以便為資料 提供額外的資料結構,該資料結構被 用於提公升 查詢的有效性。buckets 桶 的工作依賴於表中某個列的 雜湊函式值...