获取 PCollection 中的所有元素而不考虑标记

Get all elements in a PCollection regardless of tagging

我有一个 BigQuery TableRow 元素的 PCollection,这些元素根据 TableRow 的一列是否被成功解析而被标记。

final TupleTag<TableRow> OK = new TupleTag<TableRow>(){};
final TupleTag<TableRow> NOTOK = new TupleTag<TableRow>(){};

我的 ParDo 函数根据列解析标记这些 TableRow,以及 returns 一个名为 myPCollection 的 PCollectionTuple。

我想做以下事情:

  1. 获取 PCollection 中的所有元素(标记为 OK 和 NOTOK),并将它们输出到 BigQuery。
  2. 只获取标记为 NOTOK 的元素并将它们发送到 Pub/Sub

我知道我可以通过调用

来完成#2
myPCollection.get(NOTOK)

我找不到执行#1 的方法。我看到有一个名为 myPCollection.getAll() 的方法,但它不是 PCollection,而是 returns 一个 Map,PCollection>

关于如何获取整个元素集而不管它们是如何标记的,有什么想法吗?

您可以使用 Flatten 转换 (Beam guide) 将不同的 PCollection 合并为一个:

PCollection<String> okResults = myPCollection.get(OK);
PCollection<String> notOkResults = myPCollection.get(NOTOK);

PCollectionList<String> pcl = PCollectionList.empty(p);
pcl = pcl.and(okResults).and(notOkResults);
PCollection<String> allResults = pcl.apply(Flatten.pCollections());

在这种情况下 allResults 将包含 OKNOTOK 元素。我做了一个例子(完整代码here),其中有两条输入线,它们被分类为好的或坏的侧输出:

Feb 01, 2020 10:42:24 PM org.apache.beam.examples.AllSideOutputs processElement
INFO: All elements: bad line
Feb 01, 2020 10:42:24 PM org.apache.beam.examples.AllSideOutputs processElement
INFO: All elements: good line
Feb 01, 2020 10:42:24 PM org.apache.beam.examples.AllSideOutputs processElement
INFO: Ok element: good line
Feb 01, 2020 10:42:24 PM org.apache.beam.examples.AllSideOutputs processElement
INFO: Not Ok element: bad line

使用 2.17.0 SDK 和 DirectRunner 测试。