Вы, конечно, правы. Цитата просто неверна. 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
немного более тонкие, поскольку фильтры обычно сдвигаются вниз, но в целом поведение аналогично.