摘要:要說在中常見的函數是哪一個,當然是。是一個實現了接口的抽象類,其中是數據處理方法,強制子類必須實現。以上為學習一天的總結,有錯誤歡迎指正。相同的是這個方法處理的都是中的一個元素。
在閱讀本文前,可先看一下官方的WordCount代碼, 對Apache Beam有大概的了解。
要說在Apache Beam中常見的函數是哪一個,當然是apply()。常見的寫法如下:
[Final Output PCollection] = [Initial Input PCollection].apply([First Transform]) .apply([Second Transform]) .apply([Third Transform])
而在最簡單的wordcount代碼中,就出現了許多種不同的傳入參數類型,除了輸入輸出的部分,還包括
1)使用ParDo.of():
.apply("ExtractWords-joe", ParDo.of(new DoFn() { @ProcessElement public void processElement(ProcessContext context) { System.out.println(context.element()+"~"); for (String word : context.element().split(" ")) { if (!word.isEmpty()) { //輸出到Output PCollection context.output(word); } } } }) )
2)使用MapElements.via():
.apply("FomatResults", MapElements.via(new SimpleFunction,String>() { @Override public String apply(KV input) { return input.getKey()+":"+input.getValue(); } }))
3)以及使用PTransform子類:
.apply(new CountWords()) public static class CountWords extends PTransform, PCollection >> { @Override public PCollection > expand(PCollection lines) { // Convert lines of text into individual words. PCollection words = lines.apply( ParDo.of(new ExtractWordsFn())); // Count the number of times each word occurs. PCollection > wordCounts = words.apply(Count. perElement()); return wordCounts; } }
這么多種傳入方式到底有什么聯系?通過查看源碼可以看出apply函數的定義如下:
publicOutputT apply( String name, PTransform super PBegin, OutputT> root) { return begin().apply(name, root); }
傳入的參數為PTransform類對象,也就是這幾種傳入參數其實都是PTransform類的變形。
PTransform是一個實現了Serializable接口的抽象類,其中public abstract OutputT expand(InputT input); 是數據處理方法,強制子類必須實現。
因此第(3)種方式很容易理解,就是通過繼承PTransform并實現了expand方法定義了CountWords類,給apply方法傳遞了一個CountWords對象。
在第(2)種方式中,MapElements是PTransform的子類,實現了expand方法,其實現方式是調用@Nullable private final SimpleFunction
public staticMapElements via( final SimpleFunction fn) { return new MapElements<>(fn, null, fn.getClass()); }
傳入了一個SimpleFunction對象,SimpleFunction是一個必須實現public OutputT apply(InputT input) 方法的抽象類,用戶在該apply方法中實現數據處理。
所以這種方式的實現方式如下:
定義SimpleFunction的子類并實現其中的apply方法,將該子類的對象傳遞給MapElements.via()。
第(1)種方式中,ParDo.of()方法傳入一個DoFn對象, 返回一個SingleOutput對象:
public staticSingleOutput of(DoFn fn) { validate(fn); return new SingleOutput ( fn, Collections. >emptyList(), displayDataForFn(fn)); }
SingleOutput與MapElements類似,也是PTransform的子類,實現了expand方法,使用private final DoFn
而DoFn是一個抽象類,用戶必須實現其注解方法(存疑) public void processElement(ProcessContext c)。
所以這種方式的實現方式如下:
定義DoFn的子類并實現其中的processElement方法,將該子類的對象傳遞給ParDo.of()。
需要注意的是processElement方法與前2種方式不同,輸入和輸出數據都是在傳入參數ProcessContext c中,而不是通過return進行傳遞。
以上為學習Apache Beam一天的總結,有錯誤歡迎指正。
**
Day2補充,3種方式的區別和聯系:**
1)MapElement.via(SimpleFunction)和PTransform
MapElements是PTransform的一個子類:
public class MapElements
extends PTransform
從泛型參數來看,PTransform處理的是PCollection,而MapElement處理的是PCollection中的一個元素,對比SimpleFunction的apply方法和PTransform的expand方法的實現方式得到驗證。
2)MapElement.via(SimpleFunction)和ParDo.of(DoFn)
區別之前已經說過,DoFn的processElement方法的輸入和輸出都是從參數傳入,而SimpleFunction的apply方法從參數傳入輸入,從return傳出輸出。
相同的是這2個方法處理的都是PCollection中的一個元素。
查看MapElement的expand方法源碼:
@Override public PCollectionexpand(PCollection extends InputT> input) { checkNotNull(fn, "Must specify a function on MapElements using .via()"); return input.apply( "Map", ParDo.of( new DoFn () { @ProcessElement public void processElement(ProcessContext c) { c.output(fn.apply(c.element())); } //部分代碼忽略 })); }
可以看出其實也是實現了DoFn的子類,在DoFn的processElement方法中調用SimpleFunction對象的apply方法進行處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70467.html
摘要:與用于與的轉換。其中方法返回的是在中的位置下標。對于設置了多個觸發器的,自動選擇最后一個觸發的結算結果。其他不是線程安全的,一般建議處理方法是冪等的。 Combine與GroupByKey GroupByKey是把相關key的元素聚合到一起,通常是形成一個Iterable的value,如: cat, [1,5,9] dog, [5,2] and, [1,2,6] Combine是對聚...
摘要:需要注意的是和方法生成的觸發器是連續的而不是一次性的。其他的還有一次性觸發器將一次性觸發器變為連續型觸發器,觸發后再次等待觸發。例如與一起用可以實現每個數據到達后的分鐘進行處理,經常用于全局窗口,可以用觸發器來設置停止條件。 本文參考Apache Beam官方編程手冊 可以結合官方的Mobile Game 代碼閱讀本文。 在默認情況下,Apache Beam是不分窗的,也就是采用Gl...
摘要:首頁地址關于我們我們不是的官方組織機構團體,只是技術棧以及的愛好者基礎編程思想和大數據中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔區塊鏈中文文檔數學筆記線性代數筆記數據科學中文文檔中文文檔中文文檔課本計算 首頁地址:http://www.apachecn.org關于我們:http://www.apachecn.org/about 我們不是 Apach...
摘要:首頁地址關于我們我們不是的官方組織機構團體,只是技術棧以及的愛好者基礎編程思想和大數據中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔區塊鏈中文文檔數學筆記線性代數筆記數據科學中文文檔中文文檔中文文檔課本計算 首頁地址:http://www.apachecn.org關于我們:http://www.apachecn.org/about 我們不是 Apach...
閱讀 2950·2023-04-26 01:32
閱讀 1543·2021-09-13 10:37
閱讀 2282·2019-08-30 15:56
閱讀 1676·2019-08-30 14:00
閱讀 3047·2019-08-30 12:44
閱讀 1967·2019-08-26 12:20
閱讀 1065·2019-08-23 16:29
閱讀 3233·2019-08-23 14:44