Dataflow / Apache Beam-如何按顺序设计管道操作?

时间:2018-10-03 02:33:23

标签: google-cloud-dataflow apache-beam dataflow

作为Dataflow / Apache Beam的一部分,我想从源读取,然后写入源,然后再次从一个源读取,然后再次按此顺序写入。 如何确保以下R-> W-> R-> W的顺序?我相信以下内容就像R-> W的并行管道一样运行。我不确定是否可以使用PDone对象来实现这一点。

(在下面的示例中,BIGQUERYVIEWB是由TESTDATASET1.TABLE2和其他一些表组成的大查询视图)

//Read 1
PCollection<TableRow> tr = pipeline.apply(BigQueryIO.readTableRows().fromQuery("SELECT ID FROM `TESTDATASET1.BIGQUERYVIEWA`").usingStandardSql());
PCollection<TableRow> tr1= tr.apply(ParDo.of(new SomeFn()));
//Write 1
tr1.apply(BigQueryIO.writeTableRows().withoutValidation()
                    .withSchema(FormatRemindersFn.getSchema())
                    .withWriteDisposition(WriteDisposition.WRITE_APPEND)
                    .to("TESTDATASET1.TABLE2"));
//Read 2
PCollection<TableRow> tr2 = pipeline.apply(BigQueryIO.readTableRows().fromQuery("SELECT ID FROM `TESTDATASET1.BIGQUERYVIEWB`").usingStandardSql());
PCollection<TableRow> tr3= tr.apply(ParDo.of(new SomeFn()));
//Write 2
tr3.apply(BigQueryIO.writeTableRows().withoutValidation()
                    .withSchema(FormatRemindersFn.getSchema())
                    .withWriteDisposition(WriteDisposition.WRITE_APPEND)
                    .to("TESTDATASET1.TABLE3"));

1 个答案:

答案 0 :(得分:0)

看看Wait.On()转换,该转换使您可以设置相关步骤。

这是一个简单的伪代码示例:

PCollection<String> data = ...;

PCollection<Something> first = data.apply(ParDo.of(..))

data.apply(Wait.On(first)).apply(ParDo.of(..))

请注意,Wait.On(..)需要使用PCollection作为信号,而不需要PDone。我相信BigQuery.Write会返回WriteResult,您可以从中提取失败插入的PCollection。