Spark Sql Left Join(多对多)导致的数据膨胀问题和解决

问题:大表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
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


版权声明:本文为lilyjoke原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。