take(10) 与 limit(10).collect() 的性能比较

Lea*_*nis 2 scala dataframe apache-spark apache-spark-sql

我有一个包含十亿条记录的数据框,我想从中取出 10 条记录。

哪种方法更好更快?

df.take(10)或者df.limit(10).collect()

Ant*_*n.P 6

这两种方法将产生相同的性能,仅仅是因为它们的实现是相同的

来自github 上的Spark 实现

def take(n: Int): Array[T] = head(n)
Run Code Online (Sandbox Code Playgroud)

而 head 的实现是:

def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Run Code Online (Sandbox Code Playgroud)

如您所见, head 完全是通过使用limit+ 实现的collect

因此它们导致相同的性能,您测量的差异必须是随机变化,尝试多次运行实验以克服它。


Gau*_*hah 0

Spark 进行惰性进化。因此,无论您使用哪个 API,它们都会为您提供相同的结果和相同的性能。