如何在 javapairrdd 中使用 containsAll 和 contains 过滤器

Posted

技术标签:

【中文标题】如何在 javapairrdd 中使用 containsAll 和 contains 过滤器【英文标题】:how to use filter using containsAll and contains in javapairrdd 【发布时间】:2018-02-20 11:35:33 【问题描述】:

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

如果 mypairRdd2 包含列表中提到的所有值,我正在尝试使用 containsAll 应用过滤器。预期结果是 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());             
    
);

谁能指出我做错了什么...

【问题讨论】:

【参考方案1】:

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

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

        return list.containsAll(set);
    );

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

【讨论】:

感谢 Ernest 的宝贵回复,我只有一个查询:如果我将 containsAll 更改为 contains,它不会产生任何结果,但它应该会返回一些结果。 我知道 contains 将采用一个对象,但在这里我试图使用 contians 实现列表的“任何”和“所有”的列表函数。 不确定我是否理解您的评论,但如果您注意到,调用 containsAll 时使用的集合是按值从组创建的集合。如果您想检查该列表是否包含任何值而不是全部,那么它只是必须更改的最后一条语句。但它必须从使用可迭代列表的 containsAll 进行更改。

以上是关于如何在 javapairrdd 中使用 containsAll 和 contains 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

我如何从 JavaPairRDD 中过滤记录

如何相交不同的JavaPairRDD

如何将 JavaPairRDD 转换为数据集?

如何将数据集转换为 JavaPairRDD?

通过操作 JavaPairRDD 的值 (Sum) 来转换 JavaPairRDD

Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?