火花。修改密钥

时间:2017-03-24 11:24:21

标签: apache-spark partitioning

首先,抱歉,如果这是一个转储问题,我对Spark有点新。

我正在尝试在Spark中进行一些组操作,并且在修改RDD的密钥时我试图避免额外的随机播放。

原始RDD是json Strings

简化逻辑我的代码如下:

case class Key1 (a: String, b: String)

val grouped1: RDD[(Key1, String)] = rdd1.keyBy(generateKey1(_))
val grouped2: RDD[(Key1, String)] = rdd2.keyBy(generateKey2(_))

val joined: RDD[(Key1, (String, String)) = groped1.join(grouped2)

现在我想在密钥中包含一个新字段并执行一些reduce操作。所以我有类似的东西:

case class key2 (a: String, b: String, c: String)

val withNewKey: RDD[Key2, (String, String)] = joined.map{ case (key, (val1, val2)) => {
   val newKey = Key2(key.a, key.b, extractWhatever(val2))
   (newKey, (val1, val2))
}}

withNewKey.reduceByKey.....

如果我没有错,由于Key已经改变,分区会丢失,因此reduce操作可能会使数据混乱,但是没有意义,因为密钥已经扩展并且不需要随机播放。

我错过了什么吗?我怎么能避免这种混乱?

由于

1 个答案:

答案 0 :(得分:2)

您可以mapPartitions preservesPartitioning设置为true

joined.mapPartitions(
  _.map{ case (key, (val1, val2)) => ... },
  true
)