第九章 Hive企業級調優之小表 大表Join

2021-09-29 10:41:55 字數 2243 閱讀 8533

將key相對分散,並且資料量小的表放在join的左邊,這樣可以有效減少記憶體溢位錯誤發生的機率;再進一步,可以使用map join讓小的維度表(1000條以下的記錄條數)先進記憶體。在map端完成reduce。

實際測試發現:新版的hive已經對小表join大表和大表join小表進行了優化。小表放在左邊和右邊已經沒有明顯區別。

案例實操

1.需求

測試大表join小表和小表join大表的效率

2.建大表、小表和join後表的語句

// 建立大表

create

table bigtable(id bigint

,time

bigint

, uid string, keyword string, url_rank int

, click_num int

, click_url string)

row format delimited fields

terminated

by'\t'

;

// 建立小表

create

table smalltable(id bigint

,time

bigint

, uid string, keyword string, url_rank int

, click_num int

, click_url string)

row format delimited fields

terminated

by'\t'

;

// 建立join後表的語句

create

table jointable(id bigint

,time

bigint

, uid string, keyword string, url_rank int

, click_num int

, click_url string)

row format delimited fields

terminated

by'\t'

;

3.分別向大表和小表中匯入資料

hive (

default

)>

load

data

local inpath '/opt/module/datas/bigtable'

into

table bigtable;

hive (

default

)>

load

data

local inpath '/opt/module/datas/smalltable'

into

table smalltable;

4.關閉mapjoin功能(預設是開啟的)

set hive.auto.convert.join = false;
5.執行小表join大表語句

insert overwrite table jointable

select b.id, b.

time

, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url

from smalltable s

left

join bigtable b

on b.id = s.id;

time taken: 35.921 seconds

norows affected (

44.456 seconds)

6.執行大表join小表語句

insert overwrite table jointable

select b.id, b.

time

, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url

from bigtable b

left

join smalltable s

on s.id = b.id;

time taken: 34.196 seconds

norows affected (

26.287 seconds)

第九章 Hive企業級調優之動態分割槽調整

關係型資料庫中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽 dynamic partition 只不過,使用hive的動態分割槽,需要進行相應的配置。1 開啟動態分割槽引數設定 1 開啟動態分割槽功能 預設t...

第九章 Hive企業級優化之推測執行

在分布式集群環境下,因為程式bug 包括hadoop本身的bug 負載不均衡或者資源分布不均等原因,會造成同乙個作業的多個任務之間執行速度不一致,有些任務的執行速度可能明顯慢於其他任務 比如乙個作業的某個任務進度只有50 而其他所有任務已經執行完畢 則這些任務會拖慢作業的整體執行進度。為了避免這種情...

第九章 Hive企業級優化之並行執行

hive會將乙個查詢轉化成乙個或者多個階段。這樣的階段可以是mapreduce階段 抽樣階段 合併階段 limit階段。或者hive執行過程中可能需要的其他階段。預設情況下,hive一次只會執行乙個階段。不過,某個特定的job可能包含眾多的階段,而這些階段可能並非完全互相依賴的,也就是說有些階段是可...