在spark中选择和过滤的顺序是否有任何偏好?

时间:2018-11-04 17:05:04

标签: python apache-spark

我们有两种方法来选择和过滤来自火花数据帧df的数据。首先:

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

第二:

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

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

2 个答案:

答案 0 :(得分:1)

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

enter image description here

请确认您可以在数据框上调用explain(true)来检查其优化计划,这两个查询都相同。

Query1计划: enter image description here

Query2计划: enter image description here

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

答案 1 :(得分:-1)

是的,如果您要处理的数据量很大且列数很大,您会注意到一个不同之处

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")