Apache spark spark访问前n行-获取vs限制
我想访问spark数据帧的前100行,并将结果写回CSV文件 为什么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&
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)