假设我已经有了JavaPairRDD。主要目的只是修改第二个值,而不是更改配对密钥。我怎么能这么做?例如,我有一个JavaPairRDD,它的值为:
("first", "1;2")
("second", "3;4")
所以我想把它改成
("first", "3")
("second", "7")
我知道我们可以先映射,然后再减少,但这只是一个简单的例子,如果我们映射,然后减少,我的情况可能会复杂得多。有没有什么方法可以像迭代数组一样直接修改JavaPairRDD的值?
当然可以。使用mapValues()
:
JavaPairRDD<Long,Integer> pairRDD = ...
JavaPairRDD<Long,String> mapped = pairRDD.mapValues(
new Function() {
@Override
public String call(Integer i) {
return i.toString();
}
);
例如,这将每个Integer
值转换为其String
表示。钥匙保持不变。
下面是mapValues的示例:
输入
("first", "1;2")
("second", "3;4")
代码:
JavaPairRDD<String, String> pairs = lines.mapToPair(f -> {
String[] tokens = f.toString().split(",");
return new Tuple2<String,String>(tokens[0], tokens[1]);
});
JavaPairRDD<String, Integer> output = pairs.mapValues(f -> {
String[] tokens = f.split(";");
Integer a = Integer.parseInt(tokens[0]);
Integer b = Integer.parseInt(tokens[1]);
return a + b;
});
List<Tuple2<String, Integer>> res = output.collect();
for(Tuple2 t : res){
System.out.println(t._1 + "," + t._2);
}