我想访问 Spark 数据帧的前 100 行并将结果写回 CSV 文件。
为什么
take(100)
基本上是即时的,而
df.limit(100)
.repartition(1)
.write
.mode(SaveMode.Overwrite)
.option("header", true)
.option("delimiter", ";")
.csv("myPath")
需要永远。 我不想获取每个分区的前 100 条记录,而是只想获取任意 100 条记录。
为什么
take()
比limit()
快这么多?
虽然还是有答案,但我想分享一下我学到的东西。
myDataFrame.take(10)
-> 产生行数组。 这是一个操作并执行收集数据(就像收集一样)。
myDataFrame.limit(10)
-> 产生一个新的数据框。 这是一个转换,并不执行收集数据。
我没有解释为什么限制需要更长的时间,但这可能已经在上面得到了回答。这只是对 take 和 limit 之间区别的基本答案。
这是因为 Spark 目前不支持谓词下推,请参阅这个非常好的答案。
实际上,take(n) 也应该花费很长时间。然而,我刚刚测试了它,并得到了与您相同的结果 - 无论数据库大小如何,take 几乎都是瞬时的,而 limit 需要很长时间。
Limit() 在分区中不起作用,因此执行起来会花费更多时间
对我来说,极限就是工作:
limitDF= df.limit(5)
更好的方法是使用过滤器限制您的数据
filterDF= df.filter("name = 'jitendra'").limit(5)
.take()
可能是答案,但我使用了一个简单的 head 命令,如下所示
df.head(3)
.take()
对我不起作用。