这是来自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/