hive中大表join小表情況

2021-09-10 23:39:02 字數 2143 閱讀 8039

和join相關的優化主要分為mapjoin可以解決的優化(即大表join小表)和mapjoin無法解決的優化(即大表join大表),前者相對容易解決,後者較難,比較麻煩。

首先介紹大表join小表優化。以銷售明細表為例來說明大表join小表的場景。

假如**商進行評級,比如(五星、四星、三星、二星、一星),此時因為人員希望能夠分析各**商星級的每天銷售情況及其佔比。

開發人員一般會寫出如下sql:

selectseller_star, count(order_id) as order_cnt

from

(selectorder_id,seller_idfromsales_detail_tablewherepartition_value='20181010' ) a

left outer join

(selectseller_id, seller_startfromdim_sellerwherepartition_value =''20181010' ) b

ona.seller_id = b.seller_id

group byb.seller_star;

現實世界的二八準則將導致訂單集中在部分**商上,而好的**商的評級通常會更高,此時更加加劇了資料傾斜的程度,如果不加以優化,上面sql將會耗費很長時間,,甚至執行不出結果。

通常來說,**商是有限的,比如上千家,上萬家,數量不會很大,而銷售明細表比較大,這就是典型的大表join小表的問題,可以通過mapjoin的方式來優化,只需要新增mapjoin hint即可,

優化後的sql如下:

select/*+mapjoin(b)*/

seller_star, count(order_id) as order_cnt

from

(selectorder_id,seller_idfromsales_detail_tablewherepartition_value='20181010' ) a

left outer join

(selectseller_id, seller_startfromdim_sellerwherepartition_value =''20181010' ) b

ona.seller_id = b.seller_id

group byb.seller_star;

/*+mapjoin(b)*/ 即是mapjoin hint,如果需要多個mapjoin多個表,則格式為:/*+mapjoin(b,c,d)*/.。 hive對於mapjoin是預設開啟的,設定引數為:

set hive.auto.convert.join = true;

mapjoin優化是在map階段進行join,而不是通常那樣在reduce階段按照join列進行分發後在每個reduce節點上進行join,不需要分發也就沒有傾斜的問題,相反,hive會將小表

全量複製到每個map任務節點(對於本例是dim_seller表,當然進全量複製b表 sql指定的列),然後每個map任務節點執行lookup小表即可。

從上面的分析可以看出,小表不能太大,否則全量複製分發得不償失,實際上hive根據引數hive.mapjoin.smalltable.size(0.11.0版本後是hive.auto.convert.join.nonconditionaltask.size) 來確定小表的

大小是否滿足條件(預設25mb),實際中此引數允許的最大值可以修改,但是一般最大不能超過1gb(太大的話map任務所在的節點記憶體會撐爆,hive會報錯。另外需要注意的是,hdfs顯示的檔案

大小是壓縮後的大小,當實際載入到記憶體的時候,容量會增大很多,很多場景下會膨脹10倍)。

hive大表join空key優化

假如不需要id為null的資料!此時可以將a表中id為null的字段提前過濾,減少mr在執行時,輸入的資料量!解決 將null值過濾,過濾後再執行join select from a where c is not null a left join b on a.c b.ca表中c欄位為null的資料...

hive兩個大表join操作

1 第一次優化,on 字段準換成型別相同 2 第二次優化,on 後面欄位的缺失率很高 為空 字段長度為零 字段填充了非整數 關聯欄位為無效字段,則不需要關聯 3 雖然設定了左表關聯欄位為空不去關聯右表,但是這樣做,左表中未關聯的記錄 欄位為空 將會全部聚集在乙個reduce中進行處理,體現為redu...

hive 桶表,以及高效的join方式

前面2種的話都是經常會用到,說下第三種 桶 join 桶 smb 物理上,每個桶就是表 或分割槽 目錄裡的乙個檔案。smb的設計是為了解決大表和大表之間的join的。簡單的說下她的思想 大表化成小表,map side join 解決。經典的分而治之的思想。對乙個表或者乙個分割槽,可以將其劃分為更細的...