使用带有List值的JavaPairRDD映射

时间:2017-11-08 05:26:50

标签: java apache-spark rdd

我正在尝试使用List值对JavaPairedRDD进行迭代。我想迭代每个条目,但似乎我总是迭代值列表中的所有元素。例如,我有一个像这样的配对RDD。

[(0,[date, date, date]), (1,[str, str, str]), (2,[str, str, str]), (3,[str, int, str]), (4,[int, int, int]), (5,[float, float, int]), (6,[float, float, float])]

我想为Pair的每个条目提取值中最常见的元素。所以对于这个,我想要

[date, str, str, str, int, float, float]

我该怎么做?我将列出我尝试过的几次尝试,但它们正在迭代值中的所有元素。我定义了一个返回列表最常见元素的函数,并尝试了这个:

JavaRDD<String> resultrdd = pair_rdd.map(e -> mostCommon(e._2));

和这个

JavaRDD<String> result = pair_rdd.flatMap(new FlatMapFunction<Tuple2<Integer, List<String>>, String>(){

    @Override
    public Iterator<String> call(Tuple2<Integer, List<String>> t) throws Exception {
            List<String> result = new ArrayList<String>();
            // TODO Auto-generated method stub
            List<String> type = t._2;
            result.add(mostCommon(type));
            return result.iterator();
        }

});

全部导致列表中的所有元素,因此

[date, str, str, str, int, float, float,date, str, int, str, int, float, float,date, str, str, str, int, int, float]

我认为e._2并不是指整个列表,而是指列表中的每个元素。有帮助吗?

编辑:这是我最常见的方法。如果有&#34;无&#34;,它只是喜欢另一种类型。

public static <String> String mostCommon(List<String> list) {
    Map<String, Integer> map = new HashMap<>();

    for (String t : list) {
        Integer val = map.get(t);
        map.put(t, val == null ? 1 : val + 1);
    }

    Entry<String, Integer> max = null;

    for (Entry<String, Integer> e : map.entrySet()) {
        if (e.getKey().equals("None")==false) {
            if (max == null || e.getValue() > max.getValue())
                max = e;
        }
    }
    if(max==null) {
        return (String) "None";
    }else {
        return max.getKey();
    }
}

1 个答案:

答案 0 :(得分:0)

您需要map,而不是flatMap。您正在将元组转换为单个元素,而不是将嵌套列表展平

你需要return mostCommon(t._2),假设返回一个字符串

  

我认为e._2并不是指整个清单,

它必须是整个列表。否则,这不会编译

List<String> type = t._2;

您的前7个元素是正确的,所以我认为您的RDD中有额外的数据