我是新来的 Spark-SQL
阅读 Hive
table。我想知道spark是如何实现多表的 Join
. 我在某个地方读到,建议总是将最大的表放在联接顺序的顶部等等,这有利于 Join
效率。我了解到,在连接中,spark按顺序加载第一个表(最大的表)以存储内存,并流式传输另一个表,这有助于提高连接性能。但是,我对这种策略如何提高性能感到困惑,因为最大的表(在大多数情况下)无法放入内存并溢出到磁盘上。
有谁能解释一下Spark在发动机罩下接合时采用的接合机构吗[ large
与 medium
], [ large
与 small
]以及[ large
与 large
]以联接类型表示的表( 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
非常感谢您的帮助。谢谢。
1条答案
按热度按时间xriantvc1#
关于连接的顺序,spark提供了查找连接中表的最佳配置(顺序)的功能,但它与一些配置设置有关(下面的代码在pyspark api中提供):
cbo-必须打开基于成本的优化器(在2.4中默认为关闭)
joinreorder必须打开(在2.4中默认为关闭)
为了让它尽可能好地工作,最好先计算表的统计信息。可按以下步骤进行:
计算统计信息在这里非常重要,因为spark将根据该统计信息估计联接中表的大小,并相应地对它们重新排序。为了获得更好的估计,还可以为列启用直方图计算(在2.4中,默认情况下也是关闭的):
此操作所针对的最大表数
joinReorder
可通过此设置控制默认值为12。