我想访问spark Dataframe 的前100行,并将结果写回CSV文件。
为什么take(100)
基本上是即时的,而
df.limit(100)
.repartition(1)
.write
.mode(SaveMode.Overwrite)
.option("header", true)
.option("delimiter", ";")
.csv("myPath")
我不想获得每个分区的前100条记录,而只是任何100条记录。
为什么take()
比limit()
快?
6条答案
按热度按时间t3irkdon1#
虽然现在还没有答案,但我想分享一下我学到的东西。
->**结果是一个数组。**这是一个动作,执行收集数据(就像collect一样)。
->**导致一个新的数据框架。**这是一个转换,不执行收集数据。
我没有解释为什么limit需要更长的时间,但这可能已经在上面回答了。这只是一个基本的答案,说明take和limit之间的区别。
zynd9foi2#
这是因为Spark目前不支持 predicate 下推,参见this very good answer。
实际上,take(n)也需要很长的时间,我刚刚测试了一下,得到的结果和你一样-- take几乎是即时的,不管数据库大小如何,而limit需要很多时间。
mum43rcc3#
你可以使用take(n)来限制数据。在屏幕截图中添加完整的代码和输出。
![](https://i.stack.imgur.com/f382V.jpg)
dwthyt8l4#
Limit()在分区中不起作用,因此需要更多的时间来执行
mlmc2os55#
限制我的工作:
更好的方法是使用过滤器限制数据
t8e9dugd6#
.take()
可能是答案,但我使用了一个简单的head命令,如下所示.take()
不适合我。