从主题PubSub读取数据流并写入Bigquery(多个表)

时间:2020-03-18 02:34:59

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

有人在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));

有什么建议吗?

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的那样,原始作者(@Ryan McDowell)解释了几乎相同的用户scenario,使用了GCP Pub / Sub消息队列中的JSON负载,并执行了到Bigquery的动态路由表,从发布/订阅消息中的特定属性中提取某些表名。

example的管道中,我们看到了DynamicDestinations类的<ng-container>方法,该方法用于从消息中提取特定的属性(<ng-container *ngFor="let item of portfolios$ | async; let index=i"> {{ item }} </ng-container> )其中包含Bigquery表名,最后标识目标对象TableDestination()