首页 > 解决方案 > 将 PColll 行的一个字段写入 BQ - 需要整行用于表选择

问题描述

我有个问题:

我的 Pcoll 由这种格式的行组成

{'word':'string','table':'string'}

我只想将单词写入 BigQuery,但是我需要表格字段才能在 BigQuery 中选择正确的表格。

这就是我的管道的外观:

tobq = (input
        | 'write names to BigQuery '>> beam.io.gcp.bigquery.WriteToBigQuery(
          table=compute_table_name, schema=compute_schema,
          insert_retry_strategy='RETRY_ON_TRANSIENT_ERROR',
          create_disposition=beam.io.gcp.bigquery.BigQueryDisposition.CREATE_IF_NEEDED,
          write_disposition=beam.io.gcp.bigquery.BigQueryDisposition.WRITE_APPEND)
       )

函数 compute_table_name 访问一个元素并返回表字段。有没有办法只将单词写入 BQ,同时仍然具有基于行的表选择机制?

非常感谢!

标签: google-cloud-dataflowapache-beamapache-beam-io

解决方案


ignoreUnknownValues通常,在 BigQuery 中遇到此类情况的最佳方法是使用ExternalDataConfiguration. 不幸的是,Apache Beam 尚不支持在写入 BigQuery 时启用此参数,因此我们必须找到一种解决方法,如下所示:

将 ID 映射传递给表作为table_side_input

此解决方案仅适用word于保证每次都映射到同一个表的相同值,或者您的元素有某种唯一标识符的情况。此方法比解决方案 1 更复杂一些,但它仅依赖于 Beam 模型,而不必触及 BigQuery API。

该解决方案涉及利用table_side_input动态选择要放置元素的表,即使元素缺少table字段也是如此。基本思想是创建一个 ID:table 的字典(其中 ID 是唯一 ID,或者只是word字段)。创建这个字典可以CombineGlobally通过将所有元素组合成一个字典来完成。

同时,您使用转换table在转换之前从元素中删除字段WriteToBigQuery。然后将 dict 传递给 的table_side_input参数WriteToBigQuery,并编写一个可调用的table参数,该参数与 dict 一起检查以确定要使用的表,而不是table字段。


推荐阅读