如何比较两对rdd

时间:2016-07-11 23:41:49

标签: java apache-spark key-value rdd

我有两对RDDs r1和r2,包含定义为

的元组
Tuple2<Integer,String[]> 

我想要做的是从两个RDD中找到具有相同键的元组,而不是将r1中值部分(String [])的每个元素与r2中的其他元素进行比较,而不是返回它们的元素索引举一个例子,让我们假设r1就像:

{ (1,["a1","b1","c1"]) (2,["x1","y1","z1"])...}

和r2就像:

{ (1,["a2","b2","c2"]) (3,["x2","y2","z2"])...}

如果我们在这里看到,关键字(1)存在于两个RDD中,所以它关注,现在我想扫描两个RDD中的值部分,并逐个比较元素与具有相同索引的元素其他RDD,当我发现相同的元素(从r1和r2中的元组具有相同的索引)时,我返回其索引的值,让我们解释一下

  

这是在r1中具有键1的元组:

  (1,["a1","b1","c1"])
  

这是在r2中具有键1的元组:

(1,["a2","b2","c2"])

通过扫描,我将“a1”与“a2”,“b1”与“b2”进行比较,将“c1”与“c2”进行比较

我认为在比较之后我发现:

"a1".equals"a2"=true, "b1".equals"b2"=false, and "c1".equals"c2"=false

知道java中的表的索引从0开始,并且正如我之前所说的,我想返回不等于的元素的索引,遵循这个例子我将返回index1 = 1和index2 = 2,我该怎么做呢?

  

注意:如果我必须返回多个索引,我认为我会在一个名为

的INtegers RDD中收集它们会更好
  JavaRDD <Integer> indexes
  

我希望它干净利落,我将感谢你们的帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用join然后map执行此操作。

JavaPairRDD<Integer,Integer[]> idWithIndexes = r1.join(r2).map(new Function<Tuple2<Integer,Tuple2<String[],String[]>>,Tuple2<Integer,Integer[]>>(){
    @Override
    public Tuple2<Integer, Integer[]> call(Tuple2<Integer, Tuple2<String[], String[]>> t) throws Exception {
        int id = t._1;
        String[] s1 = t._2._1;
        String[] s2 = t._2._2;
        int length = Math.min(s1.length, s2.length);

        List<Integer> index = new ArrayList<Integer>();
        for (int i = 0; i < length; i++) {
            if (!s1[i].equals(s2[i])) {
                index.add(i);
            }
        }

        return new Tuple2<Integer,Integer[]>(id, index.toArray(new Integer[0]));
    }   
});

这将返回id和index数组的JavaPairRDD