原始sql的寫法如下,可以跑成功但是跑了40分鐘。
select
user_id, site_id, cc_id
from tbl_1
left join tbl_2
on tbl_1.id = tbl_2.id;
查看job details, 發現其中一個stage跑了40分鐘,但是這個stage的其它task用了30就跑完了,只有一個task跑了40分鐘。

按照Shuffle Read Size從大到小的順序查看Executor列表,第一個Executor產出的記錄數是307million, 其它的Executor就少很多。

之后,sql改成如下, 運行時間縮短至10分鐘。
select
user_id, site_id, cc_id
from tbl_1
left join tbl_2
on tbl_1.id = tbl_2.id
where tbl_1.id = 'AA'
union all
select
user_id, site_id, cc_id
from tbl_1
left join tbl_2
on tbl_1.id = tbl_2.id
where tbl_1.id = 'BB'
union all
select
user_id, site_id, cc_id
from tbl_1
left join tbl_2
on tbl_1.id = tbl_2.id
where tbl_1.id is null or (tbl_1.id <> 'AA' and tbl_1.id <> 'BB')
;
總結:是什么提升了性能?
主鍵id有大量null值,導致相同的記錄數(相同的hash value)分配給同一個Executor,方案是把null值的記錄數單獨處理,并且保證沒有重復數據。
浙公網安備 33010602011771號