2016-05-18 135 views
2

我使用的Spark 1.5/1.6,在這裏我想做的數據幀reduceByKey操作,我不想使用df轉換爲RDD。星火據幀reduceByKey

每一行貌似和我有ID1多行。

id1, id2, score, time 

我想有這樣的:

id1, [ (id21, score21, time21) , ((id22, score22, time22)) , ((id23, score23, time23)) ] 

所以,對於每一個「ID1」,我想所有記錄列表中的

順便說一句,之所以不要轉換DF到RDD是因爲我要加入這個(減少)數據幀到另一個數據幀,而我在連接鍵上,這使得它更快做重新劃分,我想同樣也不能與RDD做

任何幫助將不勝感激。

回答

3

只是簡單的維護已經取得那麼分區重新使用父RDD分區在reduceByKey調用:

val rdd = df.toRdd 
val parentRdd = rdd.dependencies(0) // Assuming first parent has the 
            // desired partitioning: adjust as needed 
val parentPartitioner = parentRdd.partitioner 
val optimizedReducedRdd = rdd.reduceByKey(parentPartitioner, reduceFn) 

如果你要指定分區如下:

df.toRdd.reduceByKey(reduceFn) // This is non-optimized: uses full shuffle 

那麼您記錄的行爲將發生 - 即發生全面洗牌。這是因爲將使用HashPartitioner來代替。