我有一个拥有数十亿条记录的数据框,我想从中取出10条记录。
哪种方法更好,更快?
df.take(10)
或df.limit(10).collect()
?
答案 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
答案 3 :(得分:-1)
Spark的较旧版本过去在读取整个数据集的限制操作方面存在问题,而较新版本则共享@ Anton.P
指出的相似实现。检查您使用的版本或使用 Take 以确保安全
一旦使用Data Source API v2,将来可能会改善此行为 准备好了: