Scala 与take(10)和limit(10)的性能比较。collect()
我有一个有10亿条记录的数据框,我想从中取出10条记录 哪种方法更好更快Scala 与take(10)和limit(10)的性能比较。collect(),scala,dataframe,apache-spark,apache-spark-sql,Scala,Dataframe,Apache Spark,Apache Spark Sql,我有一个有10亿条记录的数据框,我想从中取出10条记录 哪种方法更好更快 df.take(10)或df.limit(10.collect()?Spark做惰性进化。因此,无论您使用哪种API,两者都会以相同的性能提供相同的结果 使用take(10),它应该是瞬时的 myDataFrame.take(10) //Action df.limit(10) //Transformation 参考:这两种方法将产生相同的性能,这仅仅是因为它们的实现是相同的 从Spark开始实施 而head的实施是: d
df.take(10)
或df.limit(10.collect()
?Spark做惰性进化。因此,无论您使用哪种API,两者都会以相同的性能提供相同的结果 使用take(10),它应该是瞬时的
myDataFrame.take(10) //Action
df.limit(10) //Transformation
参考:这两种方法将产生相同的性能,这仅仅是因为它们的实现是相同的 从Spark开始实施 而head的实施是:
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
如您所见,head是通过使用limit
+collect
实现的
因此,它们会产生相同的性能,您测量的差异一定是随机变化,请尝试多次运行该实验以克服它。但在我的例子中,我可以看到df.limit(10).collect()的速度要快一点。我的假设是,从十亿条记录的数据帧中提取(10)是一件具有挑战性的事情。但是,将数据帧切割成10条记录并收集会更好。还要再增加一点。即使我们再次给出提取(10),它在内部使用了限制(10)和其他一些函数,它们的实现也不一样,一个是“通过触发查询执行”@lssilva您应该将take(即head)与limit+collect进行比较,limit会返回一个新的数据集,因为它不是一个action@lssilvaa)此问题涉及Python,而不是Scala。b) 这正是take(n)被limit+collect替换的修复方法,检查pull请求你是对的,在过去它们似乎有不同的实现,但这一更改使它同步了:所选择的物理查询计划与延迟计算无关。
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)