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 中更改 filter
和 select
的位置(我的意思是在我们从选定列中使用的过滤器的定义中,而不是更多),那么哪一个性能更高?为什么? filter
和 select
交换不同的动作有什么区别吗?
【问题讨论】:
【参考方案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计算