Apache spark spark访问前n行-获取vs限制

Apache spark spark访问前n行-获取vs限制,apache-spark,apache-spark-sql,limit,Apache Spark,Apache Spark Sql,Limit,我想访问spark数据帧的前100行,并将结果写回CSV文件 为什么take(100)基本上是即时的,而 df.limit(100) .repartition(1) .write .mode(SaveMode.Overwrite) .option("header", true) .option("delimiter", ";") .csv("myPath&

我想访问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)
->生成一个行数组。 这是一个操作,用于收集数据(与collect类似)

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

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

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

df.head(3)

.take()
对我无效。

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

因此,您可以使用
take(100)
确实;问题是什么?为什么take比limit快得多。我确实可以,但到目前为止还没有找到一种方法来创建本地阵列的df以使用CSV处理功能。Limit应该只提供这一点。Collect仅适用于spark数据帧。当我收集前100行时,它是即时的,数据作为常规列表驻留在内存中。从火花的意义上来说,收集是不可能的。当然,你是对的,我忘了拿一张清单。我只是测试了一下,得到了同样的结果——我希望take和limit都很慢。Spark scala 2.2动作和转换之间的区别是正确的,但这并不能解释为什么限制所需的时间要比执行时间长(一旦计划执行)。
df.head(3)