原始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值的记录数单独处理,并且保证没有重复数据。

 

posted on 2025-07-07 17:01  dw2nn  阅读(4)  评论(0)    收藏  举报