java - 如何使用javapairrdd中的containsAll和contains来使用过滤器

标签 java apache-spark rdd java-pair-rdd

我有 2 个集合,一个是“list”,另一个是“pairRdd2”,其中包含如下所述的数据。

我正在尝试使用 containsAll 应用过滤器,其中如果 mypairRdd2 包含列表中提到的所有值。预期结果是 joe,{US,UK}

List<String> list = Arrays.asList("US","UK");

JavaRDD pairRdd = ctx.parallelize(Arrays.asList(new Tuple2("john","US"),new Tuple2("john","UAE"),new Tuple2("joe","US"),new Tuple2("joe","UK")));

JavaPairRDD<String, String> pairRdd2 = JavaPairRDD.fromJavaRDD(pairRdd);

pairRdd2.groupByKey().filter(x-> Arrays.asList(x._2).containsAll(list)).foreach(new VoidFunction<Tuple2<String,Iterable<String>>>() {

    @Override
    public void call(Tuple2<String, Iterable<String>> t) throws Exception {
        System.out.println(t._1());             
    }
});

有人可以强调一下我做错了什么......

最佳答案

问题出在 Arrays.asList() 上。这将创建一个 Iterable 列表,这不是执行过滤器所需的列表。您应该使用 groupBy 本身给出的列表:

    pairRdd2.groupByKey().filter(f -> {
        Set<String> set = new HashSet<>();
        for(String s: f._2())
            set.add(s);

        return list.containsAll(set);
    });

您还可以找到一种将迭代器/迭代器转换为集合并完全避免循环的快速方法。

关于java - 如何使用javapairrdd中的containsAll和contains来使用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48884417/

相关文章:

java - Swing : Setting JButton's background

java - 更改 Eclipse 窗口生成器下的 Java 程序图标

java - 如何获取chrome浏览器Cookies并在IE浏览器中使用

scala - 如何根据值列表过滤 RDD

java - Spark 转换和 Action 的逻辑是否需要线程安全?

返回多个 RDD 的 Java Spark 映射步骤

java - 代表性曝光

sql - 不带 '?'的JDBC RDD查询语句

apache-spark - 为什么 Spark 1.6 不使用 Akka?

java - 如何运行多个 Spark Cassandra 查询