spark访问前n行-占用与限制

9fkzdhlc  于 2023-10-23  发布在  Apache
关注(0)|答案(6)|浏览(131)

我想访问spark Dataframe 的前100行,并将结果写回CSV文件。
为什么take(100)基本上是即时的,而

df.limit(100)
      .repartition(1)
      .write
      .mode(SaveMode.Overwrite)
      .option("header", true)
      .option("delimiter", ";")
      .csv("myPath")

我不想获得每个分区的前100条记录,而只是任何100条记录。
为什么take()limit()快?

t3irkdon

t3irkdon1#

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

myDataFrame.take(10)

->**结果是一个数组。**这是一个动作,执行收集数据(就像collect一样)。

myDataFrame.limit(10)

->**导致一个新的数据框架。**这是一个转换,不执行收集数据。
我没有解释为什么limit需要更长的时间,但这可能已经在上面回答了。这只是一个基本的答案,说明take和limit之间的区别。

zynd9foi

zynd9foi2#

这是因为Spark目前不支持 predicate 下推,参见this very good answer
实际上,take(n)也需要很长的时间,我刚刚测试了一下,得到的结果和你一样-- take几乎是即时的,不管数据库大小如何,而limit需要很多时间。

mum43rcc

mum43rcc3#

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

dwthyt8l

dwthyt8l4#

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

mlmc2os5

mlmc2os55#

限制我的工作:

limitDF= df.limit(5)

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

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

t8e9dugd6#

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

df.head(3)

.take()不适合我。

相关问题