Spark 中的广播加入不适用于左外

S G*_*uly 3 amazon-emr apache-spark apache-spark-sql pyspark

我有一个小表(2k)记录和大表(500万)记录。我需要从小表中获取所有数据,并且只从大表中获取匹配数据,因此为了实现这一点,我执行了下面的查询虽然 select /*+ broadcast(small)*/ small.* From small left outer join large 查询返回正确的结果,但是当我检查查询计划时,它显示排序合并的广播哈希连接。如果小桌留下的桌我们不能广播,有什么限制吗?那么出路是什么?

小智 8

由于您希望从小表而不是大表中选择整个数据集,因此 Spark 不会强制执行广播连接。但是,如果您更改连接顺序或转换为等连接,Spark 将很乐意启用广播连接。

例如:

  1. 大表左外连接小表——启用广播
  2. 小表左外连接大表——禁用广播

原因:造成 这种情况的原因是Spark将小表(也称为广播表)共享给大表数据存在的所有数据节点。在您的情况下,您需要小表中的所有数据,但只需要大表中的匹配数据。Spark无法确定特定记录是否在另一个数据节点匹配或根本不匹配,因此如果小表是分布式的,则从小表中选择所有记录时会存在歧义。因此,Spark 在这种情况下不会使用广播连接。