SparkSqlLeftJoin(多对多)导致的数据膨胀问题和解决问题:⼤表left join⼩表,⼩表有20万条,⼤概就12M⼤⼩。⼤表有30多亿条,对应分区下有40个HDFS⽂件,简单的⼀个left join,跑了⼏个⼩时跑不出结果。
INSERT OVERWRITE TABLE 结果表 PARTITION(dt='20220302')
select
vertice,types,gid
from (
select
vertice,gid,types
from
⼤表
where dt='20220302'
) a
left join (
SELECT
srcgid,dstgid
FROM
⼩表
WHERE dt='20220302') as b
sql left join 多表连接on a.gid = b.srcgid
解决:
1. 刚开始没仔细研究,做了两个优化:⼩表cache然后⼴播;⼤表select的时候重分区,增加并发数,还是没跑过,发现执⾏到left join的时候,数据膨胀得⾮常⼤,6000万的数据 join 20万数据,膨胀到千亿条。
2. 定位发现,在⼩表中,相同的srcgid对应多条不同的dstgid,⽐如相同的srcgid对应有100个dstgid,那么left join时,匹配的⼤表记录,每条记录都会膨胀成100条,和业务对接好需求之后,修改了,srcgid对应的dstgid只取其中⼀个,使⼤表关联⼩表的多对多情况,变成多对1。这样跑了⼏分钟就跑出来了。
--对这张⼩表重新⼊库,srcgid只对应⼀个dstgid,其他代码不变。
INSERT OVERWRITE TABLE ⼩表 PARTITION(dt='20220303')
select srcgid,min(dstgid) from (
select srcgid,dstgid from map表1 WHERE dt='20220303'
union
select srcgid,dstgid from map表2 WHERE dt='20220303'
)a
group by srcgid