【问题标题】:WriteToBigQuery Dynamic table destinations returns wrong tableIdWriteToBigQuery 动态表目标返回错误的 tableId
【发布时间】:2021-12-10 20:20:53
【问题描述】:

我正在尝试将 bigquery 写入不同的表目标,如果这些表尚不存在,我想动态创建它们。

bigquery_rows | "Writing to Bigquery" >> WriteToBigQuery(lambda e: compute_table_name(e),
                                                schema=compute_table_schema,
                                                additional_bq_parameters=additional_bq_parameters,
                                                write_disposition=BigQueryDisposition.WRITE_APPEND,
                                                create_disposition=BigQueryDisposition.CREATE_IF_NEEDED,
                                                )

compute_table_name 函数其实很简单,我只是想让它工作。

def compute_table_name(element):
    if element['table'] == 'table_id':
        del element['table']
        return "project_id:dataset.table_id"

已正确检测到架构,并已创建表并填充了记录。问题是,我得到的表 ID 类似于:

datasetId: 'dataset'
projectId: 'project_id'
tableId: 'beam_bq_job_LOAD_AUTOMATIC_JOB_NAME_LOAD_STEP...

我也尝试在我的 compute_table_name 函数中返回一个 bigquery.TableReference 对象,但无济于事。

编辑:我正在使用 apache-beam 2.34.0,并且我在 JIRA here

上打开了一个问题

【问题讨论】:

    标签: python google-bigquery apache-beam


    【解决方案1】:

    您的管道代码很好。但是,您可以将 callable 传递给 compute_table 名称函数:

    bigquery_rows | "Writing to Bigquery" >> WriteToBigQuery(compute_table_name,
                                                schema=compute_table_schema,
                                                additional_bq_parameters=additional_bq_parameters,
                                                write_disposition=BigQueryDisposition.WRITE_APPEND,
                                                create_disposition=BigQueryDisposition.CREATE_IF_NEEDED,
                                                )
    

    BigQuery 中的'beam_bq_job_LOAD_AUTOMATIC_JOB_NAME_LOAD_STEP' 表名可能意味着加载作业尚未完成,或者它有错误;您应该查看 BigQuery 用户界面中的“个人历史记录”或“项目历史记录”标签,了解作业的状态。

    【讨论】:

    • 我已经尝试过您的解决方案,但没有成功。当我检查 UI 时,我可以看到表格目标不正确,正如我在帖子中声明的那样。
    【解决方案2】:

    我通过关注this answer 找到了我的答案的解决方案。这感觉像是一种解决方法,因为我没有将可调用对象传递给 WriteToBigQuery()。测试了一堆方法,我发现直接给方法提供一个字符串/TableReference 它可以工作,但没有给它一个可调用的。

    我每 15 分钟处理约 50 个演出的数据,分布在 6 个表中,并且运行良好。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 请使用您问题上的编辑链接添加其他信息。 Post Answer 按钮应仅用于问题的完整答案。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多