例如,我有一个包含 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")
(,它可能非常大,尤其是在使用联接时。