spark中select和filter的顺序有什么偏好吗?

问题描述 投票:0回答:2

我们有两种方法从 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
的定义中),哪一个性能更高?为什么?
filter
select
交换不同的动作有什么区别吗?

apache-spark pyspark
2个回答
7
投票

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

enter image description here

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

查询1计划: enter image description here

查询2计划: enter image description here

PS:新的变化是引入了基于成本的优化器。


-2
投票

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

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

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

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

这是相反的方式,它首先选择列,然后应用过滤器

差异

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

因此请始终遵循以下内容以节省转换时间。

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

© www.soinside.com 2019 - 2024. All rights reserved.