首先,抱歉,如果这是一个转储问题,我对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操作可能会使数据混乱,但是没有意义,因为密钥已经扩展并且不需要随机播放。
我错过了什么吗?我怎么能避免这种混乱?
由于
答案 0 :(得分:2)
您可以mapPartitions
preservesPartitioning
设置为true
:
joined.mapPartitions(
_.map{ case (key, (val1, val2)) => ... },
true
)