问题:大表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版权协议,转载请附上原文出处链接和本声明。