spark 访问前 n 行 - take vs limit

spark access first n rows - take vs limit

我想访问 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() 快这么多?

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

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

虽然还是有人回答,但我想分享一下我学到的东西。

myDataFrame.take(10)

-> 生成行数组。 这是一个操作并执行收集数据(就像收集一样)。

myDataFrame.limit(10)

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

我没有解释为什么 limit 需要更长的时间,但这可能已经在上面得到了回答。这只是对 take 和 limit 之间区别的基本回答。

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

df.head(3)

.take() 对我不起作用。

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

Limit() 不会在分区中起作用,因此需要更多的时间来执行