【问题标题】:Why Spark explain these two query differently?为什么 Spark 以不同的方式解释这两个查询?
【发布时间】:2017-06-08 15:13:53
【问题描述】:

所以我有这两个查询来实现相同的目标。使用 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: 这是查询 B:

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

【问题讨论】:

  • 非常有趣..通过第一次查看您的查询,您的第二个查询似乎将数据集过滤到最小,并传递给大数据选择(通过广播哈希连接,因此广播结果大小较小)。这就是它快速的原因。但令人惊讶的事实是加载 7 027 202 行它显示不同的时间(第一次查询 13.2 秒和 3.2 秒)对于大数据集,即 inspex.defect_parquet 在你的 2 个统计图中

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


【解决方案1】:

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

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

【讨论】:

  • “项目”到底是什么意思?
  • @Jesse Projection 表示从所有列中仅选择少数列。因此,不会发送完整的源数据集,而只会发送少数选定的列。在 SQL 中投影在 SELECT 中
  • 我认为您的第三点可能是原因。因为我又查了一下解释,发现投影栏后好像也少了很多。但是查询 B 避免了大表中的过滤器。谢谢。
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
相关资源
最近更新 更多