Spark SQL 中的 where 子句与 join 子句

Posted

技术标签:

【中文标题】Spark SQL 中的 where 子句与 join 子句【英文标题】:Where clause versus join clause in Spark SQL 【发布时间】:2016-08-11 15:51:58 【问题描述】:

我正在编写一个查询以从表 A 中获取满足表 B 中记录条件的记录。例如:

表 A 是:

Name           Profession        City 
John           Engineer          Palo Alto
Jack           Doctor            SF

表 B 是:

Profession     City      NewJobOffer
Engineer       SF           Yes

我有兴趣获得表 c:

Name   Profession  City NewJobOffer
Jack   Engineer    SF      Yes 

我可以通过两种方式使用 where 子句或连接查询,哪一种更快,为什么在 spark sql 中? 比较列的where子句添加选择那些记录或加入列本身,哪个更好?

【问题讨论】:

我注意到 WHERE 和 ON 给出不同的结果 【参考方案1】:

最好在 WHERE 子句中提供过滤器。这两个表达式不等价。

当您在 JOIN 子句中提供过滤时,您将检索两个数据源,然后按指定条件连接。由于 join 是首先通过 shuffle(在 executor 之间重新分配)数据完成的,因此您将 shuffle 很多数据。

当您在 WHERE 子句中提供过滤器时,Spark 可以识别它,您将有两个数据源过滤然后加入。这样,您将洗牌更少的数据。可能更重要的是,这样 Spark 还可以进行过滤下推,在数据源级别过滤数据,这意味着网络压力更小。

【讨论】:

以上是关于Spark SQL 中的 where 子句与 join 子句的主要内容,如果未能解决你的问题,请参考以下文章

哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器

如果 where 子句已经修复,如何加快 spark sql 过滤器查询?

Spark SQL - IN 子句

spark sql 在不使用 where 子句的情况下将所有数据加载到内存中

PostgreSQL 中的 SQL JOIN - WHERE 子句中的执行计划与 ON 子句中的不同

深入理解CQL中的Where子句