我们有两种方法从 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
交换不同的动作有什么区别吗?
Spark(1.6 及以上版本)使用 catalyst optimiser 进行查询,因此性能较差的查询将转换为高效的查询。
只是为了确认您可以在数据帧上调用explain(true)来检查其优化计划,这对于两个查询都是相同的。
PS:新的变化是引入了基于成本的优化器。
是的,如果您正在处理具有大量列的大量数据,您会注意到差异
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")