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的時候的優化方式 第...