和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)
);