为什么spark对这两个查询有不同的解释?

cqoc49vn  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(336)

所以我用这两个查询来实现相同的目标。使用sparksql。
查询a:

SELECT * FROM inspex.defect_parquet a
INNER JOIN inspex.layer_parquet b
ON a.id = b.id 
AND b.name = 'Example1';

查询b:

SELECT * FROM inspex.defect_parquet 
WHERE inspex.layer_scan_index  
IN    (SELECT layer_scan_index
      FROM inspex.layer_parquet
      WHERE name = 'Example1');
``` `defect_parquet` 是一张很大的table `layer_parquet` 是一个有几百kb的小表。
查询b比查询a快80%。当我看到spark如何运行的解释。以下是查询:
![](https://i.stack.imgur.com/fzhbJ.png)
以下是查询b:
![](https://i.stack.imgur.com/52YSr.png)
似乎spark处理这些的方式不同。有人能给我解释一下吗?为什么查询b更快?
juzqafwq

juzqafwq1#

我认为统计数据说明了一切:
两个版本都使用广播连接
但是,在第二个查询中,您在子查询中创建项目,因此输出表要小得多—这导致广播大小和时间要小得多
第一个查询尝试预过滤大型数据集,但是没有太多更改—数据集仍然很大,因此此优化只会减慢第一个查询的速度

相关问题