【发布时间】:2020-03-18 02:34:59
【问题描述】:
有人在 Dataflow 中使用过 DynamicDestination,他有一个简单且描述的示例。我厌倦了在 git (https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/DLPTextToBigQueryStreaming.java) 中看到示例传送,成为 apache Beam 的新手让我很痛苦。顺便说一句,我需要做的是从 Pubsub 读取消息并通过 Dataflow 作业写入 BigQuery 数据集中的不同目标(表)。我有一个非常适合 Bigquery 表的自定义项目,但 Pubsub 主题将包含来自同一数据集的多个目的地。此外,消息是 JSON 格式,并包含一个带有目标表名称的字段。
这是我最有代表性的代码
TopicToBigQueryOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(TopicToBigQueryOptions.class);
Pipeline p = Pipeline.create(options);
p.apply(Constants.READ_PUBSUB, PubsubIO.readStrings().fromSubscription(options.getInputSubscription()))
.apply(Constants.LINE_TO_CHAMP, new PubSubToTableRowTransform())
.apply(Constants.WRITE_CHAMPBAN, BigQueryIO.writeTableRows()
.to(options.getTableStagingFileLines())
.withSchema(AmplaChangeLogSchema.getTableSchema())
.withCreateDisposition(CREATE_IF_NEEDED)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND));
有什么建议吗?
最好的问候
【问题讨论】:
-
看看这个example,它可能与当前用例有关。
-
是否需要将每条pubsub消息内容写在一张表中(可以根据pubsub消息内容变化)?还是需要在多个表中写入相同的 pubsub 消息?
-
更正每条消息对应一个表,但我有25种不同类型的消息@guillaumeblaquiere
-
@mk_sta 该示例非常接近我的需要,不幸的是,该示例需要从生产者(在我的情况下为 kafka)设置 tableNameAttr,我无法获得。在我的例子中,我在 JSON Paylod 中有一个名为 TableName 的属性。
-
这个例子正是你所需要的。这里的表名是根据 PubSub 属性发现的。但是您可以在
getTableDestination函数中添加预处理以提取 PubSub 消息负载,根据需要对其进行解析并获得正确的值!
标签: google-bigquery google-cloud-dataflow apache-beam google-cloud-pubsub