apache-spark – 为什么过滤器不保留分区?

这是 jaceklaskowski.gitbooks.io的报价.

Some operations, e.g. map, flatMap, filter, don’t preserve partitioning.
map, flatMap, filter operations apply a function to every partition.

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

你当然是对的.报价是不正确的.过滤器确实保留了分区(出于你已经描述过的原因),确认这一点很简单

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之类的操作形成对比,map不是保留分区(Partitioner):

rdd.map(identity _).partitioner
// Option[org.apache.spark.Partitioner] = None

数据集有点微妙,因为过滤器通常是按下的,但整体行为类似.

相关文章
相关标签/搜索