这是来自jaceklaskowski.gitbooks.io的报价。



我不明白为什么过滤器不能保留分区。它只是获得满足条件的每个分区的子集,因此我认为可以保留分区。为什么不那样呢?

最佳答案

你当然是对的。引用不正确。 filter确实保留了分区(出于您已经描述的原因),并且确认以下内容很简单。

val rdd = sc.range(0, 10).map(x => (x % 3, None)).partitionBy(
  new org.apache.spark.HashPartitioner(11)
)

rdd.partitioner
// Option[org.apache.spark.Partitioner] = Some(org.apache.spark.HashPartitioner@b)

val filteredRDD = rdd.filter(_._1 == 3)
filteredRDD.partitioner
// Option[org.apache.spark.Partitioner] = Some(org.apache.spark.HashPartitioner@b)

rdd.partitioner == filteredRDD.partitioner
// Boolean = true

这与map之类的操作相反,后者不会保留存储分区(Partitioner):

rdd.map(identity _).partitioner
// Option[org.apache.spark.Partitioner] = None
Datasets更加微妙,因为过滤器通常是下推式的,但是总体行为是相似的。

关于apache-spark - 为什么过滤器不保留分区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50288483/

10-16 02:57