如何按键比较两个JavaPairRDD并比较值?

时间:2017-05-26 23:49:56

标签: java apache-spark rdd

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

现在,我只是检查了交集和联合的count(),但这还不够,如下所示:

        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);
        }

如果每个值具有相同的密钥,我如何比较它们?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我来自scala,但我相信通过一些语法更改,它也适用于java。

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

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

此解决方案背后的理念如下:

  1. 对于每个,我们将第一个和第二个RDD的值放在同一行中。这是通过join操作执行的。
  2. 映射结果(加入RDD ),以便对于每行我们true如果两个值等于false,则
  3. 然后在已映射的reduce 上应用RDD函数,并将 AND 作为元素之间的二元操作。
  4. 如果加入reduce 中的所有元素都是true,那么应用RDD函数会返回true,即所有值都是等于,否则为false

    很抱歉在scala中回答,希望有所帮助