【问题标题】:Writing to BigQuery dynamic table name Python SDK写入 BigQuery 动态表名 Python SDK
【发布时间】: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


【解决方案1】:

看看这个thread,我在那里解决了它。简而言之;在执行 python BigQuery API 请求之前,我使用内部 python 时间/日期函数来呈现变量。

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2013-01-30
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多