apache beam入門之組裝數據變換過程

目錄:apache beam 個人使用經驗總結目錄和入門指導(Java)

當我們通過option新建的pipeline後,需要進行一系列組裝過程,最後再通過pipeline.run()啓動計算。

Pipeline pipeline = Pipeline.create(option);
/**
*組裝計算過程
*/
pipeline.run();

因此編寫beam程序時最核心的部分就是組裝計算過程,其中包含1對1轉換、聚合等操作。

1對1轉換(類似於map操作)

該部分通過apply函數進行裝飾器模式組裝, 並提供了三種方式:

apply(MapElements.via(SimpleFunction對象))

該方法用於簡單的轉化操作,不需要提供額外的輸入參數。例子如下:

PCollection<String> pcMid = pcStart.apply(MapElements.via(new SimpleFunction<String, String>() {
    @Override
    public String apply(String input) {
        return input.toLowerCase();
    }
}));

可見該方法對我們而言,只要定義輸入參數和return元素是如何變化的即可,不需要關注其他的東西。

apply(ParoDo.of(DoFn對象))

該方式提供了1個context來獲取此刻的輸入元素,並通過context進行output。 該方式能夠從context獲取其他信息,例如option等,但編寫較麻煩,定義processElement時需要帶上ProcessElement註解。

        PCollection<String> pcMid = pcStart.apply(ParDo.of(new DoFn<String ,String>(){
            @ProcessElement
            public void processElement(ProcessContext context) {
                // 從管道中取出的1個元素
                String inputStr = context.element();
                // 轉成大寫
                String outputStr = inputStr.toLowerCase();
                // 輸出結果
                context.output(outputStr);
            }
        }));

apply(PTransform對象)

該方式其實是對數據集PCollection的操作, 真正對元素的轉化還要依賴於上面2種方法

PCollection<String> pcMid = pcStart.apply(new PTransform<PCollection<String>, PCollection<String>>() {
    @Override
    public PCollection<String> expand(PCollection<String> input) {
        return input.apply(ParDo.of(new StrToLowerCaseFn()));
    }
});

注意事項:
1.使用自定義的DoFn類或者SimpleFunction類進行數據轉化時,如果該類中定義了成員變量,則注意該成員必須是可序列化的(實現了Serializable接口), 否則執行時會報序列化錯誤
2.不要在DoFn或SimpleFunction的轉化函數中,通過1個輸入元素,去生成過多的輸出元素,這個過多指的是超出jvm限定內存的數量,因爲對於單個input元素,output時實際上是存儲到1個outputMap中,直到全部output完,纔會進行下一步的處理
3.不要對輸入的數據做修改,如果對輸入的數據做修改,運行時會報錯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章