【问题标题】:spark access first n rows - take vs limit火花访问前 n 行 - 采取与限制
【发布时间】:2018-03-31 15:20:17
【问题描述】:

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

【问题讨论】:

  • 所以,你确实可以使用take(100);问题是什么?
  • 为什么take比limit快这么多。
  • 确实可以,但到目前为止还没有一种方法可以创建本地数组的 df 以使用 Sparks 不错的 CSV 处理功能。限制应该只提供这个。

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


【解决方案1】:

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

myDataFrame.take(10)

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

myDataFrame.limit(10)

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

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

【讨论】:

  • 行动和转换之间的区别是正确的,但这并不能解释为什么限制应该比采取更长的时间(一旦计划执行)。
【解决方案2】:

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

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

【讨论】:

  • Collect 仅适用于 spark 数据帧。当我收集前 100 行时,它是即时的,数据作为常规列表驻留在内存中。然后不再可能以火花的方式收集。
  • 你当然是对的,我忘了拿返回列表。我刚刚对其进行了测试,得到了相同的结果 - 我预计 take 和 limit 都会很慢。
  • stackoverflow.com/questions/35869884/… take() 也有问题-您使用的是哪个版本的pyspark?
  • Spark Scala 2.2
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    df.head(3)
    

    .take() 对我不起作用。

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2020-10-05
      • 2017-08-04
      • 2016-03-03
      相关资源
      最近更新 更多