为什么Spark以不同方式解释这两个查询

时间:2017-06-08 15:13:53

标签: hadoop apache-spark apache-spark-sql

所以我有两个查询来实现相同的目标。使用Spark-SQL。

查询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是一张非常大的表格,而layer_parquet是一张数百kb的小桌子。

查询B比A快80%。当我看到Spark如何运行时的解释。这是查询A:enter image description here 这是查询B:

似乎Spark处理这些不同。有人可以向我解释一下吗?为什么查询B更快?

1 个答案:

答案 0 :(得分:1)

我认为统计数据可以说明一切:

  • 两个版本都使用广播连接
  • 但是,在第二个查询中,您在子查询中创建项目,因此输出表要小得多 - 这会导致更小的广播大小和更短的时间
  • 第一个查询尝试预过滤大型数据集,但没有多少更改 - 数据集仍然很大,因此此优化只会减慢您的第一个查询