簡體   English   中英

在Java中,如何在原始RDD和轉換后得到的RDD之間進行鏈接

[英]In java, How to link between original RDD and the RDD I get after transformations

我有一個自定義對象的RDD,比如說Person 然后,每次我得到一個新的RDD時,我都會在此RDD上使用幾個狹窄的(雖然可能是寬的)轉換。 最終我得到了具有不同類型的RDD,比如說Integer 現在,我想以某種方式知道Integer鏈接到每個Person ,並打印如下:

person a -> 3
person b -> 1
person c -> 7

我試過了:JavaPairRDD resultRDD = myRDD.mapToPair(rec-> new Tuple2(rec,new SomeFunction.call(rec)));

該代碼對我有用,因為我可以獲取每個元組並進行打印。 但是我不確定在有很多轉換的情況下這是否是實現此目標的好方法(是嗎?)

被認為可以使用另一種選擇: transformedRDD.parent(number,evidence)並以這種方式獲得原始的RDD,然后獲得一些如何識別Person和Integer之間的引用的方法。

注意: evidencescala.reflect.ClassTag<U> ,我對scala並不熟悉,所以我不太了解在那寫什么

任何幫助將不勝感激!

我會一直隨身攜帶一把鑰匙,這樣就更容易避免遺漏身份,因為每個對象每次都帶有其ID。 換一種說法:

persons
.map(p => (id, p))
.map( (id, p) => (id, transformation1(p)) )
.map( (id, p) => (id, transformation2(p)) )
....

我認為這個問題沒有正確或錯誤的答案。 不過,可能會有更好的答案。

您正在正確的道路上,首先要考慮將rdd制作成PairRDD。 但是,正如您所說的那樣,初始RDD結構有很多轉換,因此很快變得復雜。

依賴圖 對不好的圖紙表示抱歉。無論如何,對於多依賴關系,在PairRDD的關鍵字段中放置什么內容還不是很清楚。 我不確定這是否適合您,但我認為如果這種關系不是一對一的關系,那么可能會有許多人產生一個整數。 如果在解釋依賴項信息之前對Integer使用reduce操作,則需要擔心一個Integer可能不只有一個祖代。

無論如何,我認為解決此問題的最佳方法是在RDD中添加唯一標識符ArrayList字段。 無需制作PairRDD(這會增加不必要的結構),只需將此字段視為表示當前RDD字段祖先的圖形即可。

例如,Persons對象將具有一個名為“ dependency”的字段,該字段的長度為0 arraylist,因為它沒有祖先。 之后,假設您出於某種原因已轉換為Double。 然后,生成的RDD包含一個名為“ dependency”的字段,該字段的長度為1,表示Person對象的唯一標識符字段。 最后,我們已轉換為Integer。 同樣,我們有一個RDD,其字段名為“ dependency”,長度為2(因為我們有兩個祖先,這個整數)表示Person對象的唯一標識符和Double對象的唯一標識符。

我認為我的解釋有點冗長和冗長,但我希望您能理解其中的意思。

最后,如果要在RDD之間進行歸約運算,則必須考慮是否確實存在一對一的情況。 因為一個Integer可能不是來自一個Person對象,所以如果您想發現此Integer的完整譜系,則必須將所有依賴項信息添加到arraylist中。 同樣,在解密此“依賴性”數組列表時,必須記住,如果關系不是一對一的關系,並且在RDD之間使用reduce,則列表的長度可以是任意的。

我認為最好的解決方案就是這個,但是我認為可以對這個問題做出更簡單的回答。 如果您發現一個,請告訴我!

經過一些實驗,我決定使用以下解決方案:

JavaRDD<Person> persons = sc.parallelize(personList);
JavaRDD<Person,SomeType> trans1 = persons.mapToPair(p -> new Tuple2<Person,SomeType>(p, someFunction.call(p)));
JavaRDD<Person,OtherType> trans2 = trans1.mapToPair(tuple -> new Tuple2<Person,OtherType>(tuple._1(), otherFunction.call(tuple._2())));

您可以繼續執行任意操作,並且始終有對Person對象的引用。 可以使用.mapToPair以更簡潔的方式完成,而無需聲明其他RDD,但是對我來說,這樣更清晰。

暫無
暫無

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

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