从mapValues或flatMapValues访问键?

时间:2015-06-15 11:27:25

标签: scala apache-spark

在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的原因是为了保留分区。

3 个答案:

答案 0 :(得分:9)

在这种情况下,您可以将mapPartitionspreservesPartitioning属性一起使用。

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函数中为您提供(键,值)对。