spark中选择和过滤的顺序有啥偏好吗?

Posted

技术标签:

【中文标题】spark中选择和过滤的顺序有啥偏好吗?【英文标题】:Is there any preference on the order of select and filter in spark?spark中选择和过滤的顺序有什么偏好吗? 【发布时间】:2018-11-04 17:05:04 【问题描述】:

我们有两种方法可以从 spark 数据帧 df 中选择和过滤数据。第一:

df = df.filter("filter definition").select('col1', 'col2', 'col3')

第二个:

df = df.select('col1', 'col2', 'col3').filter("filter definition")

假设我们想在那之后调用count 的动作。 如果我们可以在 spark 中更改 filterselect 的位置(我的意思是在我们从选定列中使用的过滤器的定义中,而不是更多),那么哪一个性能更高?为什么? filterselect 交换不同的动作有什么区别吗?

【问题讨论】:

【参考方案1】:

Spark(1.6 及以上版本)使用catalyst optimiser 进行查询,因此性能较差的查询将转换为高效查询。

只是为了确认您可以在数据帧上调用 explain(true) 来检查两个查询的优化计划。

Query1 计划:

Query2 计划:

PS:新变化是引入cost based optimiser.

【讨论】:

【参考方案2】:

是的,如果您正在处理具有大量列的大量数据,您会注意到差异

df = df.filter("filter definition").select('col1', 'col2', 'col3')

这将首先过滤条件,然后选择所需的列

df = df.select('col1', 'col2', 'col3').filter("filter definition")

这是先选择列然后再应用过滤器的另一种方式

区别

这完全取决于您是否根据您选择的列进行过滤,最好使用 select 后跟过滤器,因为它选择过滤器之前的列,因为存在指数,过滤器的时间量将减少数据增加,但是如果您在其他一些列上应用过滤器,那么我总是建议您选择应用过滤器的列以及您想要的列,然后应用过滤器,因为它比在上应用过滤器快得多整个DF

所以总是选择下面以节省转换时间。

df = df.select('col1', 'col2', 'col3').filter("filter definition")

【讨论】:

我添加了另一个答案。请检查。 这在某些情况下可能是正确的,但一般情况下不会。最近版本的 Spark 包含一个查询优化器。大多数 RDBMS 也会像这样优化查询。

以上是关于spark中选择和过滤的顺序有啥偏好吗?的主要内容,如果未能解决你的问题,请参考以下文章

推荐系统系列:不到百行代码实现基于Spark的ItemCF计算

过滤表时加入表和存在有啥区别吗?

从 Spark 中的 DataFrame 中过滤和选择数据

在Android设备的联系人>设置中获取排序顺序偏好选择的用户以及如何减少查询时间?

Spark机器学习(11):协同过滤算法

Spark Dataframe 中的过滤操作