在 pyspark 中,是 df.select(column1, column2..) 影响性能



例如,我有一个包含 10 列的数据帧,稍后我需要将此数据帧联接与其他数据帧一起使用。但在数据帧中仅使用列 1 和列 2,其他列没有用。

如果我这样做:

df1 = df.select(['column1', 'column2'])
...
...
result = df1.join(other_df)....

这对性能有好处吗? 如果是,为什么这很好,是否有任何文件?

谢谢。

Spark 是分布式延迟计算框架,这意味着您可以选择所有列或某些列,只有在对其应用操作时,它们才会被带入内存。

所以如果你运行

df.explain()

在任何阶段,它都会显示列的投影。因此,如果仅需要该列,则它将在内存中可用,否则不会选择它。

最好指定必需的列,因为它属于最佳实践,并且还将在理解逻辑方面改进代码。

要了解有关行动和转型的更多信息,请访问此处

特别是对于连接,您必须使用的列最少(因此select(,效率最高。

当然,Spark是懒惰和优化的,这意味着只要你不调用像show()count()这样的触发函数,它就不会改变任何东西。

所以这样做:

df = df.select(["a", "b"])
df = df.join(other_df)
df.show()

或先加入,然后选择:

df = df.join(other_df)
df = df.select(["a", "b"])
df.show()

不会更改任何内容,因为它将在编译查询时先优化并选择count()show()

另一方面,为了回答你的问题,

在两者之间执行show()count()肯定会影响性能,而列数最低的列肯定会更快。

尝试比较:

df = df.select(["a", "b"])
df.count() 
df = df.join(other_df)
df.show()

df = df.join(other_df)
df.count() 
df = df.select(["a", "b"])
df.show()

你会看到时间的差异。

差异可能不会很大,但是如果您使用过滤器(df = df.filter("b" == "blabla")(,它可能非常大,尤其是在使用联接时。

最新更新