簡體   English   中英

Java Spark 中的兩個大文件作為一對多關系加入

[英]Two big files join as one to many relationship in Java Spark

我有兩個大文件

  1. email 文件
  2. 附件文件

為簡單起見說

email file is having:
eId  emailcontent 
e1     xxxxxxxx
e2     yyyyyyyy
e3     zzzzzzzz

attachment file is having:
aid   attachmentcontent   eid
a1       att1             e1  
a2       att2             e1  
a3       att3             e2
a4       att4             e3
a5       att5             e3
a6       att6             e3

注意:廣播變量連接已經使用 email 文件和其他一些小文件執行。 這兩個文件都足夠大,廣播變量不能再次使用。

我想使用帶有eid作為連接列的JavaPairRDD連接這兩個文件,但不能使用eid制作 pairRDD,因為使用相同的eid密鑰鏈接了多個附件。

試圖將JavaRDD<Email>JavaRDD<Attachment>轉換為 Dataset 並執行連接操作,但 Email class 是復雜類(它包含多個類作為變量列表),因此轉換為 Dataset 不會返回其中的任何記錄。

以上兩種方法都沒有解決我的問題。 因此,如果我遺漏了什么,請尋找此處或上述場景中未考慮的任何解決方案。

使用JavaPairRDD解決了上述問題。

對於 email 文件創建JavaPairRDD<eId, Email>因為eId對於每個 email 和附件文件創建JavaPairRDD<eId, Iterator<Attachment>>因為eId具有多個附件。

然后為 email 創建 JavaPairRDD: JavaPairRDD<eId, Email> rddEmail = emailRdd.mapToPair(record -> new Tuple2<>(eId, email)); 和用於附件的 JavaPairRDD: JavaPairRDD<eId, Iterator<Attachment>> rddAttachment = attachmentRdd.mapToPair(record -> new Tuple2<>(eId, attachment)).groupByKey();

最后按照要求執行了rddEmail.join(rddAttachment)等邏輯。

暫無
暫無

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

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