EffectservesPartitioning RDD true / false为mapPartitions提供相同的结果

问题描述 投票:-1回答:1

请阅读以下版本,但是是由最近的SO问题触发的。当然,RDD本身是遗留的,但是仍然很奇怪。

preservesPartitioning指示输入函数是否保留分区程序,除非这是一对RDD和输入功能不会修改键。

这到底是什么意思?我进行了一些测试,只是检查并注意到,无论从mapPartitions返回什么,生成的RDD的所有项目都在同一分区中。我更改了密钥,实际上剥离了它。

例如琐碎的,人为的示例:

// Alter RDD partitions stripping off K of K,V
def myfunc(iter: Iterator[(String, (Int, String))]) : Iterator[(Int,String)] = {
  iter.map{case(x,y) => (y)} 
}

val rdd1 = sc.parallelize(1 to N).map(x => (x+"xcxcx"+x, (1000, "xc888x"+x))).partitionBy(new HashPartitioner(459))
val rdd2 = rdd1.mapPartitions(myfunc,true) // or false

rdd2内容和rdd1内容的打印输出中的所有项目都在同一分区中。黄色的说明是什么意思?我用false和true运行mapPartitions,当然还要注意[]

rdd2.partitioner.get

失败。但是省略上面的直接陈述,可以得到相同的结果。那么,保存意味着什么呢?有点模糊。那么,如果为true,则false有相同的结果吗?仅在性能方面?研究尚不清楚。我喜欢的输出,我可能在这里读错了,所以...

得到的结果是:

//res94: Array[String] = Array((5xcxcx5,(1000,xc888x5)) -> 4, (6xcxcx6,(1000,xc888x6)) -> 105, (1xcxcx1,(1000,xc888x1)) -> 162, (7xcxcx7,(1000,xc888x7)) -> 206, (2xcxcx2,(1000,xc888x2)) -> 263, (9xcxcx9,(1000,xc888x9)) -> 305, (8xcxcx8,(1000,xc888x8)) -> 307, (10xcxcx10,(1000,xc888x10)) -> 325, (4xcxcx4,(1000,xc888x4)) -> 362, (3xcxcx3,(1000,xc888x3)) -> 364)
//res95: Array[String] = Array((1000,xc888x5) -> 4, (1000,xc888x6) -> 105, (1000,xc888x1) -> 162, (1000,xc888x7) -> 206, (1000,xc888x2) -> 263, (1000,xc888x9) -> 305, (1000,xc888x8) -> 307, (1000,xc888x10) -> 325, (1000,xc888x4) -> 362, (1000,xc888x3) -> 364) 

请阅读以下版本,但是是由最近的SO问题触发的。当然,RDD本身是旧的,但仍然很奇怪。 reservesPartitioning指示输入函数是否保留...

apache-spark rdd
1个回答
0
投票

preservesPartitioning表示分区上的转换不会修改分区键。换句话说,这是对执行引擎的提示,如果设置了父级的Partitioner,则对子级仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.