我想访问火花数据框的前100行,并将结果写回CSV文件。
为什么take(100)
基本上是即时的,而
df.limit(100)
.repartition(1)
.write
.mode(SaveMode.Overwrite)
.option("header", true)
.option("delimiter", ";")
.csv("myPath")
需要永远。 我不想获得每个分区的前100条记录,而只需要获得100条记录。
答案 0 :(得分:6)
这是因为Spark目前不支持谓词下推,请参阅this very good answer。
实际上,take(n)也应该花费很长时间。然而,我只是对它进行了测试,得到了与你相同的结果 - 无论数据库大小如何,几乎都是瞬间完成的,而限制需要花费很多时间。
答案 1 :(得分:0)
尽管仍然可以回答,但我想分享我学到的东西。
myDataFrame.take(10)
-> 将得到一个行数组。 这是一个动作,它执行数据收集(就像collect一样)。
myDataFrame.limit(10)
-> 产生一个新的数据框。 这是一个转换,不会执行数据收集。
我没有解释为什么限制会花费更长的时间,但是上面可以回答。 这只是对止盈和止盈之间的区别的基本回答。
答案 2 :(得分:0)
答案 3 :(得分:-4)
.take()
可能是答案,但我使用了如下所示的简单 head 命令
df.head(3)
.take()
对我不起作用。