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

时间:2019-10-07 03:48:14

标签: scala dataframe apache-spark apache-spark-sql

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

哪种方法更好,更快?

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

4 个答案:

答案 0 :(得分:4)

由于它们的实现相同,这两种方法都将产生相同的性能。

github上的Spark实施

def take(n: Int): Array[T] = head(n)

head的实现是:

def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)

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

因此,它们会产生相同的性能,您测得的差异必须是随机变化,请尝试多次进行实验以克服它。

答案 1 :(得分:1)

Spark确实是懒惰的进化。因此,无论使用哪种API都可以为您带来相同的效果和相同的性能,这无关紧要。

答案 2 :(得分:1)

使用take(10),它应该是瞬时的。

myDataFrame.take(10) //Action
df.limit(10) //Transformation

参考:spark access first n rows - take vs limit

答案 3 :(得分:-1)

Spark的较旧版本过去在读取整个数据集的限制操作方面存在问题,而较新版本则共享@ Anton.P

指出的相似实现。

检查您使用的版本或使用 Take 以确保安全

  

一旦使用Data Source API v2,将来可能会改善此行为   准备好了:

SPARK-15689

SPIP: Data Source API V2