Apache spark ';以';这改变了RDD

Apache spark ';以';这改变了RDD,apache-spark,Apache Spark,take(count)是RDD上的一个操作,它返回一个包含第一个count项的数组 是否有一个转换返回带有第一个count项的RDD?(如果计数是近似值,则可以) 我能得到的最好的是 val countPerPartition = count / rdd.getNumPartitions.toDouble rdd.mapPartitions(_.take(countPerPartition)) 更新: 我不希望数据被传输到驱动程序。在我的例子中,count可能相当大,并且驱动程序没有足够的内存

take(count)
是RDD上的一个操作,它返回一个包含第一个
count
项的数组

是否有一个转换返回带有第一个
count
项的RDD?(如果计数是近似值,则可以)

我能得到的最好的是

val countPerPartition = count / rdd.getNumPartitions.toDouble
rdd.mapPartitions(_.take(countPerPartition))
更新:
我不希望数据被传输到驱动程序。在我的例子中,
count
可能相当大,并且驱动程序没有足够的内存来容纳它。我希望数据保持并行,以便进一步转换。

为什么不使用rdd.map(..).take(X)。也就是说,变换,然后取。不要害怕做多余的工作,除非你调用take,否则所有的计算都是在spark中延迟计算的(因此只会发生~X个转换)

你可以使用
sample
,但这是基于rdd的一个百分比,而不是一个特定的计数。
sample
有多贵?如果买第1000件东西很贵,那么它也会很贵,对吗?我以前没用过,但它应该很便宜。它不会做很多工作,特别是如果你不替换样本的话。我查看了
sample
的源代码,看起来它在分区上做了一个
filter
,所以在最坏的情况下是
O(N)
。这个过滤器示例的工作原理更像你的代码样本尝试做的:Edit:Today,你需要zipWithIndex和Filter。如果我想在take之后使用.mapPartitions()呢?如果我想让数据保持并行化,该怎么办?take是操作(即计算链的末尾),它也会将数据带到驱动程序,因此您将得到一个对象列表作为结果。您可以执行以下操作:val transformed=rdd.map(…)val myList=transformed.take(X)val withMapPartition=transformed.mapPartitions(…)重点是-我不想将数据带到驱动程序。我编辑了这篇文章来强调这一点。所以你不能用take。您可能希望使用sample()或mapPartitions将数据过滤到每个分区的子集-在这种情况下,它将是一种示例,您还可以使用mapPartitionWithIndex和filter by index(例如,所有索引>X的分区都将被过滤)。请参阅问题下方注释中关于
示例的讨论。