Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 与take(10)和limit(10)的性能比较。collect()_Scala_Dataframe_Apache Spark_Apache Spark Sql - Fatal编程技术网

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

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

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

哪种方法更好更快


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)