【发布时间】:2021-04-13 05:06:37
【问题描述】:
我正在开发一个 ETL,它从数据库中提取数据,进行较小的转换并输出到 BigQuery。我已经使用 Python SDK 在 Apache Beam 2.26.0 中编写了我的管道。我正在加载十几个表,并将它们的名称作为参数传递给 beam.io.WriteToBigQuery
现在,文档说 (https://beam.apache.org/documentation/io/built-in/google-bigquery):
写入 BigQuery 时,您必须为要写入的目标表提供表架构,除非您指定 CREATE_NEVER 的创建处置。
我认为这并不完全正确。在我的测试中,我发现只有在传递静态表名时才会出现这种情况。
如果你有一堆表并且想要传递一个表名作为参数,那么它会抛出一个错误:
ErrorProto 消息:“未在作业或表上指定架构。”
我的代码:
bq_data | "Load data to BQ" >> beam.io.WriteToBigQuery(
table=lambda row: bg_config[row['table_name']],
write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,
create_disposition=beam.io.BigQueryDisposition.CREATE_NEVER
)
bq_data 是 pandas 数据框行的字典。我有一个列table_name。 bq_config 是一个字典,其中 key = row['table_name'] 并且值的格式为:
[project_id]:[dataset_id].[table_id]
有人对此有什么想法吗?
【问题讨论】:
-
你需要传递一个也是动态的模式:一个 lambda 或返回给定表模式的函数
标签: python google-bigquery google-cloud-dataflow apache-beam