問題: 在開始加入步驟之前,Spark是否必須完成處理reduceByKey步驟中的所有條目?在啓動加入步驟之前,Spark是否必須完成reduceByKey步驟中的所有條目的處理?這取決於reduceByKey的結果嗎?
我認爲答案是否定的。我認爲每個分區/任務在移動到聯接之前必須完成reduceByKey任務。
詳情: 在下面的例子中,我減少關鍵用戶id的RDD,和鳥巢都具有相同的用戶ID到列表中的值。
然後,我將(userid,listOfEvents)的此RDD與另一個RDD(userid,otherEvent)結合在一起。
請注意,在此示例中,reduceByKey和join之間的分區程序是相同的(userId上的默認HashParitioner),那麼reduceByKey是否必須在聯接之前完全處理所有數據纔會發生此變化?
在這個例子中,List(eventA,eventB)與EventK沒有eventC連接的場景永遠不會發生,對嗎?
但是,List(eventA,eventB,eventC)可能與Event K結合在一起,但EventD和Event F不會減少但可能發生?
Impression Events
userId Event
1 eventA
1 eventB
1 eventC
2 eventD
2 eventF
Conversion Events
userId Event
1 eventK
2 eventL
// The Reduce Step
final JavaPairRDD<Long, ObjectArrayList<Event>> impressionRDD = loadImpressionEvents()
.mapToPair(event -> {
final ObjectArrayList<Event> list = new ObjectArrayList();
list.add(new Event(event.getTimestamp(),
event.getCampaignIdentifier(), event.getSiteIdentifier()));
return new Tuple2<>(
event.getUserId(),
list
);
})
.reduceByKey((event1, event2) -> {
// Combine impression events with the same user id
event1.addAll(event2);
return event1;
});
// The Join Step
final JavaPairRDD<Long, Tuple2<ConversionEvent, Event>> conversionImpressions = loadConversionEvents()
.mapToPair(event -> new Tuple2<>(
event.getUserId(),
event
))
.leftOuterJoin(impressionRDD);
是的,它會...... – 2016-07-06 21:39:31