首页 > 解决方案 > JavaPairRDD 将键值转换为键列表

问题描述

我有一个包含 (Key, Value) 的 JavaPairRDD,我想按 Keys 对其进行分组,并使“第二列”成为一个列表,其中包含为该键看到的所有值。我目前正在使用该groupby()函数,该函数正确执行键聚合,但将我的值转换为 Long 的 Iterable。这是,

Key1 Iterable<Long>
Key2 Iterable<Long>
...

有什么方法可以强制此函数使用 Long 列表而不是 Iterable 对象?

Key1 List<Long>
Key2 List<Long>
...

我读了一些关于一个函数的内容,combineByKey()但我认为这不是一个用例。可能我需要使用 reduceByKey 但我没有看到它。它应该是这样的:

myRDD.reduceByKey((a,b) -> new ArrayList<Long>()) //and add b to a 

最后,我想组合值来获得一个Key n,List<Long>RDD。感谢您的时间。

标签: javaapache-sparkrdd

解决方案


你可以尝试这样的事情:

JavaPairRDD <String, List<long>> keyValuePairs = rdd.map(t -> {
    return new Tuple2(t._1, Arrays.asList(new long[]{t._2}));
}).reduceByKey((a, b) -> {
    a.addAll(b);
    return a;
});

首先,您映射以将值转换为 long 列表。然后 reduceByKey 并使用addAllarraylist 上的方法组合列表。


推荐阅读