Google cloud dataflow 如何从一个DoFn输出一个值,并将其用作另一个DoFn中的参数?

Google cloud dataflow 如何从一个DoFn输出一个值,并将其用作另一个DoFn中的参数?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有一个用行号分隔的json的pub/sub。每个发布/订阅消息都有一个属性值,其中包含要写入的bigquery表名 如何获取单个表名值并将其传递给新管道 是否可以创建一个新的PCollection并应用它。。。从DoFn本身中?您可以应用转换来检索DoFn中的表名,并将KV对传递到下游。然后使用BigQueryIO中的动态目标支持将每条记录路由到正确的目标。或者,您也可以在BigQuery.withFormatFunction()中检索表属性。下面是一个这样做的例子 下面是整个管道结构,其中J

我有一个用行号分隔的json的pub/sub。每个发布/订阅消息都有一个属性值,其中包含要写入的bigquery表名

如何获取单个表名值并将其传递给新管道


是否可以创建一个新的PCollection并应用它。。。从DoFn本身中?

您可以应用转换来检索
DoFn
中的表名,并将
KV
传递到下游。然后使用
BigQueryIO
中的动态目标支持将每条记录路由到正确的目标。或者,您也可以在
BigQuery.withFormatFunction()
中检索表属性。下面是一个这样做的例子

下面是整个管道结构,其中JSON消息从发布/订阅中使用,然后根据发布/订阅消息属性路由到适当的表目的地。类似地,您可以更改
getTableDestination(..)
逻辑,从JSON记录中检索表名

您可以查看整个示例

/**
*使用指定的选项运行管道直至完成。此方法不会等到
*管道在返回之前完成。对结果调用{@code result.waitUntilFinish()}
*对象进行阻塞,直到管道完成运行(如果已停止阻塞编程执行)
*必需的。
*
*@param options执行选项。
*@返回管道结果。
*/
公共静态管道结果运行(选项){
//创建管道
Pipeline=Pipeline.create(选项);
//检索不可序列化的参数
String tableNameAttr=options.getTableNameAttr();
String outputTableProject=options.getOutputTableProject();
String outputTableDataset=options.getOutputTableDataset();
//构建和执行管道
管道
.申请(
“阅读信息”,
PubsubIO.readMessagesWithAttributes().fromSubscription(options.getSubscription()))
.申请(
“WriteToBigQuery”,
BigQueryIO.write()
.到(
输入->
可获取目的地(
输入,
tableNameAttr,
可输出项目,
输出数据集)
.withFormatFunction(
(PubsubMessage msg)->convertJsonToTableRow(新字符串(msg.getPayload()))
.withCreateDisposition(CreateDisposition.CREATE\u NEVER)
.withWriteDisposition(WriteDisposition.WRITE_APPEND));
返回管道。run();
}
/**
*通过提取和检索{@link pubsubsubmessage}的{@link TableDestination}
*格式化{@code tablename attr}属性的值。如果消息为空,则会显示一个{@link
*由于无法路由消息,将引发RuntimeException}。
*
*@param value从中提取表名的消息。
*@param tablename attr包含该表的消息中属性的名称
*名字。
*@param outputProject表所在的项目。
*@param outputDataset表驻留的数据集。
*@返回将输入消息路由到的目标。
*/
@可视性测试
静态TableDestination getTableDestination(
值单个窗口值,
字符串tableNameAttr,
字符串输出项目,
字符串输出(数据集){
PubsubMessage message=value.getValue();
表目的地;
如果(消息!=null){
目的地=
新目的地(
字符串格式(
“%s:%s.%s”,
outputProject,outputDataset,message.getAttributeMap().get(tableNameAttr)),
无效);
}否则{
抛出新的运行时异常(
“无法检索空消息的动态表目标!”);
}
返回目的地;
}

您可以应用转换来检索
DoFn
中的表名,并将
KV
传递到下游。然后使用
BigQueryIO
中的动态目标支持将每条记录路由到正确的目标。或者,您也可以在
BigQuery.withFormatFunction()
中检索表属性。下面是一个这样做的例子

下面是整个管道结构,其中JSON消息从发布/订阅中使用,然后根据发布/订阅消息属性路由到适当的表目的地。类似地,您可以更改
getTableDestination(..)
逻辑,从JSON记录中检索表名

您可以查看整个示例

/**
*使用指定的选项运行管道直至完成。此方法不会等到
*管道在返回之前完成。对结果调用{@code result.waitUntilFinish()}
*对象进行阻塞,直到管道完成运行(如果已停止阻塞编程执行)
*必需的。
*
*@param options执行选项。
*@返回管道结果。
*/
公共静态管道结果运行(选项){
//创建管道
Pipeline=Pipeline.create(选项);
//检索不可序列化的参数
String tableNameAttr=options.getTableNameAttr();
String outputTableProject=options.getOutputTableProject();
String outputTableDataset=options.getOutputTableDataset();
//构建和执行管道
管道
.申请(
“阅读信息”,
PubsubIO.readMessagesWithAttributes().fromSubscription(options.getSubscription()))
.申请(
“WriteToBigQuery”,
BigQueryIO.write()
.到(