【问题标题】:Apache Beam: How to continue the pipeline after Partition transform?Apache Beam:分区转换后如何继续管道?
【发布时间】:2020-05-22 07:57:23
【问题描述】:
我正在将 Apache Beam 与 Cloud Dataflow 结合使用。想象数百万种产品到达管道。经过一些步骤(过滤、映射等)后,我想按某个字段对数据进行分区。我尝试使用分区转换,我猜它分区正确。但是,我不知道如何进一步进行。这让我感到困惑:
我的目标是按某个字段对数据进行分区,并将所有这些数据写入不同的表。假设分区转换将数据切片为 18 个 PCollections,那么应该有 18 个文件。但是,分区转换返回 PCollectionList,我无法对其应用 TextIO 转换。我尝试迭代它并将 TextIO 转换应用于每个 PCollection,但它没有用。
分区转换后如何将所有部分写入文件?
谢谢,
【问题讨论】:
标签:
java
google-cloud-dataflow
apache-beam
【解决方案1】:
用于PTransform Partition的函数需要输出元素需要去的列表的索引。遵循管道应该只是引用该输出。 python中的一个例子:
with beam.Pipeline() as p:
even, odd = (p | "Create Numbers" >> Create(range(10))
| "Odd or Even" >> Partition(lambda n, partitions: n % 2, 2))
# lambda x,y: which partition fn, number partitions
# even would be when the fn outputs 0, odd when it outputs 1
even | "even write" >> beam.io.textio.WriteToText('Output/Even')
odd | "odd write" >> beam.io.textio.WriteToText('Output/Odd')