在Spark 1.3中,有没有办法从mapValues
访问密钥?
具体来说,如果我有
val y = x.groupBy(someKey)
val z = y.mapValues(someFun)
可以someFun
知道当前正在操作的关键字吗?
或者我必须这样做
val y = x.map(r => (someKey(r), r)).groupBy(_._1)
val z = y.mapValues{ case (k, r) => someFun(r, k) }
注意:我想使用mapValues
而不是map
的原因是为了保留分区。
答案 0 :(得分:9)
在这种情况下,您可以将mapPartitions
与preservesPartitioning
属性一起使用。
x.mapPartitions((it => it.map { case (k,rr) => (k, someFun(rr, k)) }), preservesPartitioning = true)
您只需要确保不要更改分区,即不要更改密钥。
答案 1 :(得分:3)
您无法将密钥与mapValues
一起使用。但您可以使用mapPartitions
保留分区。
val pairs: Rdd[(Int, Int)] = ???
pairs.mapPartitions({ it =>
it.map { case (k, v) =>
// your code
}
}, preservesPartitioning = true)
小心实际保留分区,编译器将无法检查它。
答案 2 :(得分:0)
你可以在执行groupByKey()之后应用zipWithIndex()。map(lambda x:(x [1],x [0]))。mapValues()。它将在mapValues函数中为您提供(键,值)对。