Spark 大表之间的join

最近在处理两份大表之间的join优化。

表1 数据量是 8.1G

表2 数据量是 24.1G

spark.sql.shuffle.partitions 800

5个Executor,每个Executor 10G内存,每个Executor CPU的cores是 4

制定了3中优化措施。

1:表2 直接 left join 表1.

2:表2 union 表1 ,然后groupBy

3:表1 和 表2 的读取结果 根据 join的key 做hash,然后partitionBy 写入到hdfs上,然后读取hash值的每个文件路径,最后合并。

经过测试后 发现 情况2的测试效果反而是最好,

但是最后 一个stage 读取 这个shuffle后的结果还是要将近 20min。

stage-14 中读取了24.1G 的数据,中间有一部分数据需要过滤,过滤 scan_site_id在 一张小表中的数据,之前的做法是将这份小表 broadcast后 注册 udf函数,然后 通过udf进行过滤,后来的做法是 直接将小表cache,然后进行broadcast join后,速度快了30s,不多。

stage-15 读取了24G的shuffle数据,后面有负责的逻辑处理,都是调用spark的内置函数。

最后 将这一切的复杂逻辑操作 全部放入到 MapPartitions中进行操作,速度快了10min,与之前相比,执行速度快了50%。

现在看来似乎是 通过自己的java代码实现的 执行速度 远远大于 spark调用内置函数的数据,奇怪,理论上应该spark中调用内置函数应该更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值