2017-05-26 135 views
0

我想使用Java Spark根据它们的键比较两个JavaPairRDD,比较它们的值以查看相同的键是否具有完全相同的值。如何通过键比较两个JavaPairRDD并比较值?

现在,我只检查交集和并集的计数(),但是这是不够的,象下面这样:

 JavaPairRDD<String, String> intersectionJavaPairRDD = hBaseJavaPairRDD.intersection(hiveJavaPairRDD); 
     JavaPairRDD<String, String> unionJavaPairRDD = hBaseJavaPairRDD.union(hiveJavaPairRDD).distinct(); 

     if (intersectionJavaPairRDD.count() != unionJavaPairRDD.count() 
      || hiveJavaPairRDD.count() != hBaseJavaPairRDD.count()) { 
      System.err.println(
       "ERROR: SxS validation failed..."); 
      System.exit(-1); 
     } 

我如何可以比较每个值,当他们有相同的密钥?

非常感谢!

+0

你可以使用combineByKey/AggregateByKey来比较值。 – Knight71

回答

1

我来自斯卡拉,但我确实认为只要稍加修改就可以用于java。

我的想法是加入两个RDD s,然后比较两列值。

val isEquals = hBaseJavaPairRDD 
       .join(hiveJavaPairRDD) 
       .map { 
       case (id, (v1, v2)) => v1 == v2 
       } 
       .reduce(_ && _) 

这一解决方案背后的想法是这样的:

  1. 对于我们把第一的价值观和第二RDD S中的同一行中的每个重点。这是通过join操作执行的。
  2. 结果映射(加入RDD),使每一行,我们把true如果两个值等于false否则
  3. 然后在应用reduce功能这映射RDD为二进制元素之间的操作。

运用reduce函数返回true如果在所有元素加入RDDtrue所有值都等于false否则。

对不起在scala回答,希望它有帮助