sparksql中表连接的sql顺序提高了性能

vs91vp4v  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(424)

我是新来的 Spark-SQL 阅读 Hive table。我想知道spark是如何实现多表的 Join . 我在某个地方读到,建议总是将最大的表放在联接顺序的顶部等等,这有利于 Join 效率。我了解到,在连接中,spark按顺序加载第一个表(最大的表)以存储内存,并流式传输另一个表,这有助于提高连接性能。但是,我对这种策略如何提高性能感到困惑,因为最大的表(在大多数情况下)无法放入内存并溢出到磁盘上。
有谁能解释一下Spark在发动机罩下接合时采用的接合机构吗[ largemedium ], [ largesmall ]以及[ largelarge ]以联接类型表示的表( inner & outer )参加表演。我想知道在连接表排序方面应该遵循的最佳实践,以实现spark使用的所有连接策略(smj、shufflehash和broadcast)的最佳性能。假设以下查询:

select 
a.id, 
b.cust_nm, 
c.prod_nm
from large_tab a
join medium_tab b
on a.id = b.id
join small_tab c
on a.pid = c.pid;

注:我们使用spark 2.4
非常感谢您的帮助。谢谢。

xriantvc

xriantvc1#

关于连接的顺序,spark提供了查找连接中表的最佳配置(顺序)的功能,但它与一些配置设置有关(下面的代码在pyspark api中提供):
cbo-必须打开基于成本的优化器(在2.4中默认为关闭)

spark.conf.set("spark.sql.cbo.enabled", True)

joinreorder必须打开(在2.4中默认为关闭)

spark.conf.set("spark.sql.cbo.joinReorder.enabled", True)

为了让它尽可能好地工作,最好先计算表的统计信息。可按以下步骤进行:

spark.sql("ANALYZE TABLE table_name COMPUTE STATISTICS FRO COLUMNS col1, col2, ...")

计算统计信息在这里非常重要,因为spark将根据该统计信息估计联接中表的大小,并相应地对它们重新排序。为了获得更好的估计,还可以为列启用直方图计算(在2.4中,默认情况下也是关闭的):

spark.conf.set("spark.sql.statistics.histogram.enabled", True)

此操作所针对的最大表数 joinReorder 可通过此设置控制

spark.sql.cbo.joinReorder.dp.threshold

默认值为12。

相关问题