从mapValues或flatMapValues访问键?

mit*_*hus 5 scala apache-spark

在Spark 1.3中,有没有办法从中访问密钥mapValues

具体来说,如果我有

val y = x.groupBy(someKey)
val z = y.mapValues(someFun)
Run Code Online (Sandbox Code Playgroud)

可以someFun知道它目前在哪个关键操作?

或者我必须这样做

val y = x.map(r => (someKey(r), r)).groupBy(_._1)
val z = y.mapValues{ case (k, r) => someFun(r, k) }
Run Code Online (Sandbox Code Playgroud)

注意:我想使用mapValues而不是map保留分区的原因.

Mar*_*ier 9

在这种情况下,您可以使用mapPartitionspreservesPartitioning属性.

x.mapPartitions((it => it.map { case (k,rr) => (k, someFun(rr, k)) }), preservesPartitioning = true)
Run Code Online (Sandbox Code Playgroud)

您只需要确保不要更改分区,即不要更改密钥.


Lom*_*ard 4

您不能将密钥与 一起使用mapValues。但您可以使用mapPartitions.

val pairs: Rdd[(Int, Int)] = ???
pairs.mapPartitions({ it =>
  it.map { case (k, v) =>
    // your code
  }
}, preservesPartitioning = true)
Run Code Online (Sandbox Code Playgroud)

请注意实际保留分区,编译器将无法检查它。