为什么过滤器不保留分区?

Hoo*_* M. 5 partitioning apache-spark

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

某些操作(例如地图,flatMap,过滤器)不保留分区。map,flatMap,过滤器操作将一个函数应用于每个分区。

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

hi-*_*zir 5

你当然是对的。报价是不正确的。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
Run Code Online (Sandbox Code Playgroud)

这与map不保留分区 ( Partitioner) 之类的操作形成对比:

rdd.map(identity _).partitioner
// Option[org.apache.spark.Partitioner] = None
Run Code Online (Sandbox Code Playgroud)

Datasets 有点微妙,因为过滤器通常是下推的,但总体行为是相似的。