原始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号