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 在不使用 where 子句的情况下将所有数据加载到内存中