ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Spark SQL有关broadcast join的不生效问题

2019-05-20 22:51:25  阅读:1333  来源: 互联网

标签:STATISTICS COMPUTE 小表 broadcast 广播 noscan SQL join


大数据计算通常会存在大表join小表的情况,如果相对较小的表允许广播到各个executor的话,可以使用广播方式mapjoin,这样还可以避免数据倾斜。

平时看文档记着有个参数是:

spark.sql.autoBroadcastJoinThreshold 10485760 (10 MB) Configures the maximum size in bytes for a table that will be broadcast to all worker nodes when performing a join. By setting this value to -1 broadcasting can be disabled. Note that currently statistics are only supported for Hive Metastore tables where the command ANALYZE TABLE <tableName> COMPUTE STATISTICS noscan has been run.

看到auto以为spark执行join时候会根据表的大小自动切换广播join;今天跑任务时候发现虽然满足这个阈值却无法进行广播join,只好求助于官方文档,最后发现描述是:

可以配置如上属性的阈值,指定一个进行广播join的小表大小临界值,当数值设置为-1时候禁止使用广播join,最后重点:表大小的统计信息目前只支持Hive Metastore tables,言外之意只有表可以借助 ANALYZE TABLE <tableName> COMPUTE STATISTICS noscan命令可以获取大小的hive表才可以进行广播join,因此如果你的小表是一个DataFrame计算而来的小表进行join的时候也就不会进行自动优化为广播join了。

查看Hive分区表的统计分析:

ANALYZE TABLE app_user_order(dt='2019-05-01')  COMPUTE STATISTICS noscan;

输出:

Partition app.app_dm_online_log{dt=2019-05-01} stats: [numFiles=1, numRows=178, totalSize=308285, rawDataSize=308107]

因此可以推断Spark进行优化广播join时候获取小表信息是根据元数据信息获取的,看源码可以查到相关证据。

 

那对于经过transform而来的小表是不是就不能进行广播join了呢

标签:STATISTICS,COMPUTE,小表,broadcast,广播,noscan,SQL,join
来源: https://blog.csdn.net/Dax1n/article/details/90382924

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有