我们有两种方法来选择和过滤来自火花数据帧df
的数据。首先:
df = df.filter("filter definition").select('col1', 'col2', 'col3')
第二:
df = df.select('col1', 'col2', 'col3').filter("filter definition")
假设我们要在此之后调用count
的操作。
如果我们可以在火花中更改filter
和select
的位置,哪一个性能更高(我的意思是定义从选定列中使用的过滤器,而不是更多)?为什么? filter
和select
交换不同动作有没有区别?
答案 0 :(得分:1)
Spark(1.6及更高版本)使用catalyst optimiser进行查询,因此性能较低的查询将转换为高效的查询。
请确认您可以在数据框上调用explain(true)来检查其优化计划,这两个查询都相同。
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")