2017-05-26 139 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回答,希望它有幫助