2015-06-03 35 views
1

假設我有一個PairRDD,學生(ID,姓名)。我想只保留id在另一個RDD中的行,activeStudents(id)。如何刪除RDD的密鑰不在另一個RDD中的行?

我的解決方案是從activeStudents創建一個PairDD(id,id),並且與學生做一個加入。

有沒有更好的方法來做到這一點?

回答

2

這是一個很好的解決方案。如果活躍的學生足夠小,您可以將ID作爲地圖收集,然後使用ID進行過濾(這可避免必須進行洗牌)。

0

非常類似於您的想法,如果兩個RDD都包含鍵和值,則可以執行外連接。

val students: RDD[(Long, String)] 
val activeStudents: RDD[Long] 
val activeMap: RDD[(Long, Unit)] = activeStudents.map(_ ->()) 
val activeWithName: RDD[(Long, String)] = 
    students.leftOuterJoin(activeMap).flatMapValues { 
    case (name, Some(())) => Some(name) 
    case (name, None) => None 
    } 
0

如果你不必加入這兩個數據集,那麼你應該避免它。 我最近有一個類似的問題,我成功地使用廣播的Set來解決它,我使用UDF來檢查每個RDD行(相當於其中一列的值)是否在該Set中。該UDF不是用作過濾器轉換的基礎。

更多這裏:whats-the-most-efficient-way-to-filter-a-dataframe

希望這會有所幫助。詢問是否不清楚。

相關問題