有没有办法只更改Spark中JavaPairRDD的值



假设我已经有了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);
        }

相关内容

  • 没有找到相关文章

最新更新