火花访问前n行 - 采取vs限制

时间:2017-10-19 14:31:26

标签: apache-spark apache-spark-sql spark-dataframe limit

我想访问火花数据框的前100行,并将结果写回CSV文件。

为什么take(100)基本上是即时的,而

df.limit(100)
      .repartition(1)
      .write
      .mode(SaveMode.Overwrite)
      .option("header", true)
      .option("delimiter", ";")
      .csv("myPath")

需要永远。 我不想获得每个分区的前100条记录,而只需要获得100条记录。

4 个答案:

答案 0 :(得分:6)

这是因为Spark目前不支持谓词下推,请参阅this very good answer

实际上,take(n)也应该花费很长时间。然而,我只是对它进行了测试,得到了与你相同的结果 - 无论数据库大小如何,几乎都是瞬间完成的,而限制需要花费很多时间。

答案 1 :(得分:0)

尽管仍然可以回答,但我想分享我学到的东西。

myDataFrame.take(10)

-> 将得到一个行数组。 这是一个动作,它执行数据收集(就像collect一样)。

myDataFrame.limit(10)

-> 产生一个新的数据框。 这是一个转换,不会执行数据收集。

我没有解释为什么限制会花费更长的时间,但是上面可以回答。 这只是对止盈和止盈之间的区别的基本回答。

答案 2 :(得分:0)

您可以使用 take(n) 来限制数据。在屏幕截图中添加带有输出的完整代码。enter image description here

答案 3 :(得分:-4)

.take() 可能是答案,但我使用了如下所示的简单 head 命令

df.head(3)

.take() 对我不起作用。