簡體   English   中英

如何使用Java在Spark中聯接3個RDD表?

[英]How to join 3 RDD tables in spark using java?

請忍受這一點。 我有三個RDD(來自Hadoop)。 所有這三個都有唯一的鍵,例如ippaddress和boxnumber,可以在其上進行匹配/連接。 以下是來自所有表的一些示例數據。 表A列的框號必須先轉換為編號,然后才能匹配。

Table A:
ipaddress|boxnumber|cardnumber  
94.254.57.16|59774DEa1|0D1EDF40
94.154.57.176|5F7377Ga9|0D3F796D

Table B:
cardno,boxnumber
1500914,2000096
1500413,2211469

Table C:
ipaddress|kanal|bitrate|kanaltimespent|date|country
94.254.57.16|sky|2023|003DF6A.ts|12-02-2016|chile
94.154.57.176|ITV|3425|003DF6A.ts|23-04-2014|egypt

我在Java中的首次嘗試:

    //TABLE A
    JavaSparkContext sc = SetupSparkContext("SparkSample");     
    JavaRDD<ExtractTable_A> ta_RDD= ExtractTable_A.getRDD(sc);
    JavaPairRDD<String, ExtractTable_A> A_PairRDD = ta_RDD.mapToPair(new PairFunction<extractTable_A, String, ExtractTable_A>()
    {
     @Override
     public Tuple2<String, ExtractTable_A> call(ExtractTable_A extractTable_A) throws Exception
     {
         String [] A= extractTable_A.toString().split("|") ;
         return new Tuple2<>(A[0],extractTable_A);
      }
    });
   //TABLE B
   JavaRDD<ExtractOttPdl> tb_RDD = ExtractTableB.getRDD(sc);    
   JavaPairRDD<String, ExtractTable_B> BPairRDD = tb_RDD.mapToPair(new PairFunction<extractTable_B, String, ExtractTable_B>()
    {
     @Override
     public Tuple2<String, ExtractTable_B> call(ExtractTable_B extractTable_B) throws Exception
     {
         String [] B= extractTable_B.toString().split(",") ;
         return new Tuple2<>(B[1],extractTable_B);
      }
    });

   //TABE C
    JavaRDD<ExtractTable_C> tc_RDD = ExtractTableC.getRDD(sc);      
    JavaPairRDD<String, ExtractTable_C> CPairRDD = tb_RDD.mapToPair(new PairFunction<extractTable_C, String, ExtractTable_C>()
    {
     @Override
     public Tuple2<String, ExtractTableC> call(ExtractTableC extractTable_C) throws Exception
     {
         String [] C= extractTable_A.toString().split("|") ;
         return new Tuple2<>(C[0],extractTable_A);
      }
    });

    //At this point i need to join and create an .txt output file

最終結果應該是包含這些標頭的文件

 KANAL|BITRATE|TIMESPENT|DATE|COUNTRY

===更新===我已經設法加入了表A和表B,但是現在我仍在堅持如何將TableC加入表A?

     //Joined table A and B  
     JavaPairRDD<String, Tuple2<ExtractTableA, ExtractTableB>> join_1 = A_PairRDD.join(B_PairRDD); 
    . . .
     //Joined table A and C  
     JavaPairRDD<String, Tuple2<ExtractTableA, ExtractTableC>> Join_2 = A_PairRDD.join(B_PairRDD); 


    // Output results from TableA and TableB
    join_1.map(in -> {
    return new ResultStringBuilder("|")
                .append(Long.parseLong((in._2()._1().getCardno().trim()),16))
                .append(Long.parseLong((in._2()._1().getBoxno().trim()),16))
                .append(in._2()._2().getBoxno())
                *** HERE I NEED TO ALSO APPEND THE COLUMN FROM TableC 
                .toString();
    })
            .saveAsTextFile("c:\outfile");

請記住,在使用spark API時,由於RDD是不可變的,因此在修改RDD結構中的任何內容時,您總是想創建一個新的RDD。

為了在這種情況下進行三種方式的聯接,您需要在聯接前兩個表之后創建一個新的JavaPairRDD,因為您希望擁有一個具有新鍵值對的PairRDD,因為表A,B,C的唯一鍵是不同。 有兩種方法可以做到這一點(先加入AB或先加入AC)。

表A-表B(帶有密鑰的PairRDD:箱號或卡號,或兩者均可)

加入表A和表B后,您需要使用鍵ipaddress創建一個新的PairRDD,因為您想加入表C。

// joinedAB is RDD resulting from join operation of Table A and C
JavaPairRDD joinedABForC = joinedAB.map(l -> new Tuple2(l[0], l));
// now joinedABForC has ipaddress as the RDD's key
// join rdd joinedABForC with Table C

在將unique列移至pairRdd的鍵之后,現在可以將其與表C聯接,並完成三向聯接。

已加入表AB-表C(密鑰為ipaddress的PairRdd)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM