SparkSql MAPJOIN优化之小表left join大表

首先我们要了解MAPJOIN优化原理,这里简要说明下

Spark Broadcast hash join(Hive map join同理)

1,把小表广播到所有大表分布的节点上,在每个节点上分别进行单机hash join

2,left join时只能广播右表

执行基本条件:小表必须小于参数spark.sql.autoBroadcastJoinThreshold, 默认为10M    

 

sql 场景小表需要left join大表   小表150M左右   大表1T左右

 

原始sql(广播左表,未成功,因为left join只支持广播右表)

create table tmp.iapp_mkt_per_imei_pkg_repair_t2_not_default_20200812_1 as

select /*+MAPJOIN(a) */ a.imei,b.package,1 status,1 install_type,b.imei imei_b

    from

        (select imei from tmp.iapp_mkt_per_imei_only_repair_20200812 where install_type = 0 and tail != 'default') a

        left join join

        (select imei,package from edw.sys_app_list_fact  where data_date = 20200812 and tail != 'default' and imei is not null and status in (1,2))b

        on a.imei = b.imei

以下是一些可能有助于优化大表left join小表的技巧: 1. 使用Broadcast Join:如果小表足够小,可以使用Broadcast Join小表复制到每个executor的内存中,这样可以避免Shuffle操作,提高查询速度。在Spark SQL中,可以使用broadcast()函数将小表标记为广播表。 2. 增加shuffle分区数:如果大表小表分布不均匀,可以通过增加shuffle分区数来使数据更均匀地分布在各个executor中,从而提高查询速度。可以使用以下配置参数来增加shuffle分区数: spark.sql.shuffle.partitions 3. 优化Join条件:尽量避免使用非等值Join条件,因为这会导致Spark SQL进行笛卡尔积操作,导致性能下降。如果存在非等值Join条件,可以考虑将它们转换为等值Join条件。 4. 使用Bucketing:如果大表小表具有相同的Join键,并且它们都使用相同的Bucketing列进行桶分区,则可以使用Bucketing Join来加速查询。Bucketing Join可以避免Shuffle操作,因为Spark SQL可以将具有相同Bucketing键的行分配给相同的executor。 5. 使用索引:如果小表具有索引,可以使用Spark SQL的Index Join功能来加速查询。Index Join可以通过使用小表的索引来快速查找需要的行。 6. 调整硬件资源:如果查询仍然很慢,可以考虑增加executor的数量或调整executor的内存和CPU资源。可以使用以下配置参数来调整硬件资源: spark.executor.instances spark.executor.memory spark.executor.cores
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值