beam transform

原文鏈接:https://time.geekbang.org/column/article/101735

和rdd不同,beam的transform可能是多個輸入,多個輸出,所有transform是節點,PCollection是邊
在這裏插入圖片描述

Beam 中的 PCollection 有一個抽象的成員函數Apply。使用任何一個 Transform 時候,你都需要調用這個 apply 方法。

pcollection1 = pcollection2.apply(Transform)

final_collection = input_collection.apply(Transform1)
.apply(Transform2)
.apply(Transform3)

常見transform接口:ParDo、GroupByKey。
ParDo 就是 Parallel Do 的意思,通用的並行處理數據操作。
在編寫 ParDo 時,你的輸入是一個 PCollection 中的單個元素,輸出可以是 0 個、1 個,或者是多個元素。作用:過濾一個數據集、格式轉化一個數據集、提取一個數據集的特定值

無狀態的操作:

static class UpperCaseFn extends DoFn<String, String> {
  @ProcessElement
  public void processElement(@Element String word, OutputReceiver<String> out) {
    out.output(word.toUpperCase());
  }
}

PCollection<String> upperCaseWords = words.apply(
    ParDo
    .of(new UpperCaseFn())); 


pcollection.apply(ParDo.of(new DoFn()))

有狀態的操作:比如要根據數據庫中的數據操作數據

Stateful Transform 和 side input/side output

PCollectionView<Integer> mediumSpending = ...;

PCollection<String> usersBelowMediumSpending =
  userIds.apply(ParDo
      .of(new DoFn<String, String>() {
          @ProcessElement
          public void processElement(@Element String userId, OutputReceiver<String> out, ProcessContext c) {
            int medium = c.sideInput(mediumSpending);
            if (findSpending(userId) <= medium) {
              out.output(userId);
            }
          }
      }).withSideInputs(mediumSpending)
  );


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