spark 访问前 n 行 - 取 vs 限制

问题描述 投票:0回答:6

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

apache-spark apache-spark-sql limit
6个回答
57
投票

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

myDataFrame.take(10)

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

myDataFrame.limit(10)

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

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


22
投票

这是因为 Spark 目前不支持谓词下推,请参阅这个非常好的答案

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


0
投票

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


0
投票

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


0
投票

对我来说,极限就是工作:

limitDF= df.limit(5)

更好的方法是使用过滤器限制您的数据

filterDF= df.filter("name = 'jitendra'").limit(5)

-8
投票

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

df.head(3)

.take()
对我不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.