天天看點

詳解 Flink DataStream中min(),minBy(),max(),max()之間的差別

解釋

官方文檔中:

The difference between min and minBy is that min returns the minimum value, whereas minBy returns the element that has the minimum value in this field (same for max and maxBy).

翻譯:

min和minBy之間的差別是min傳回最小值,而minBy傳回在此字段中具有最小值的元素(與max和maxBy相同)。

但是事實上,min與max 也會傳回整個元素。

不同的是min會根據指定的字段取最小值,并且把這個值儲存在對應的位置上,對于其他的字段取了最先擷取的值,不能保證每個元素的數值正确,max同理。

而minBy會傳回指定字段取最小值的元素,并且會覆寫指定字段小于目前已找到的最小值元素。maxBy同理。

示例論證

先拿min()與minBy()舉例:

取第三個元素的最小值

public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //擷取資料源
        List data = new ArrayList<Tuple3<Integer,Integer,Integer>>();
        data.add(new Tuple3<>(0,2,2));
        data.add(new Tuple3<>(0,1,1));
        data.add(new Tuple3<>(0,5,6));
        data.add(new Tuple3<>(0,3,5));
        data.add(new Tuple3<>(1,1,9));
        data.add(new Tuple3<>(1,2,8));
        data.add(new Tuple3<>(1,3,10));
        data.add(new Tuple3<>(1,2,9));

        DataStreamSource<Tuple3<Integer,Integer,Integer>> items = env.fromCollection(data);
        items.keyBy(0).min(2).print();
        
        env.execute("defined streaming source");
    }           

輸出結果:

(0,2,2)
(0,2,1)
(0,2,1)
(0,2,1)
(1,1,9)
(1,1,8)
(1,1,8)
(1,1,8)           

可以看到傳回的元素第二個字段取的是擷取到第一個元素的字段值; 往下找,第二個元素的指定值是最小的,則把這個值儲存的對應位置。

接下來再看minBy()的運作結果:

(0,2,2)
(0,1,1)
(0,1,1)
(0,1,1)
(1,1,9)
(1,2,8)
(1,2,8)
(1,2,8)           

傳回的是指定字段最小值的元素。可以看到元素數值的正确。

當然max(),maxBy同理。

更多文章:

www.ipooli.com

繼續閱讀