2016-08-23 76 views
0

下面的代碼塊之間的性能差異是什麼?Spark flatMapToPair vs [filter + mapToPair]

1.FlatMapToPair:此代碼塊使用單一的轉化,但基本上是具有在其內部的濾波條件,它返回一個空列表,在技術上不容許該元素在RDD沿前進

rdd.flatMapToPair(
    if (<condition>) 
     return Lists.newArrayList(); 

    return Lists.newArrayList(new Tuple2<>(key, element)); 
) 

2. [Filter + MapToPair]這個代碼塊有兩個轉換,其中第一個轉換僅使用與上述代碼塊相同的條件進行過濾,但在過濾器之後執行另一個轉換mapToPair。

rdd.filter(
    (element) -> <condition> 
).mapToPair(
    (element) -> new Tuple2<>(key, element) 
) 

爲放電足夠的智能,與這兩個不管轉型的數量的代碼塊執行相同或代碼塊2,因爲這些是兩個轉變表現更差?

感謝

回答

2

其實星火在第一種情況下,因爲它有初始化,然後將垃圾進行收集糟糕每個記錄新ArrayList。在大量記錄中,它會增加大量的開銷。

否則,Spark可以「足夠智能」使用懶惰的數據結構,並將不需要洗牌的多個轉換合併爲一個單獨的階段。

在某些情況下,不同轉換的顯式合併是有益的(既可以減少初始化對象的數量,也可以保持較短的血統)但這不是其中之一。