无法使用 BigQuery Python API 设置目标表

Posted

技术标签:

【中文标题】无法使用 BigQuery Python API 设置目标表【英文标题】:Cannot set destination table with BigQuery Python API 【发布时间】:2019-10-31 15:32:48 【问题描述】:

我最近在使用 Python API 时遇到以下 BigQuery 错误:

google.api_core.exceptions.BadRequest: 400 configuration.query.destinationTable 无法为脚本设置

这是我使用的功能:

def execute_bigquery_sql(query, dataset_id, table_id, use_legacy_sql=True, write_disposition='WRITE_TRUNCATE'):
    client = bigquery.Client()
    job_config = bigquery.QueryJobConfig()
    job_config.use_legacy_sql = use_legacy_sql

    print("table_id: table_id".format(table_id=table_id))
    print("dataset_id: dataset_id".format(dataset_id=dataset_id))

    if table_id:
        table_ref = client.dataset(dataset_id).table(table_id)
        print("table_ref: table_ref".format(table_ref=table_ref))
        job_config.destination = table_ref
        job_config.write_disposition = write_disposition
        job_config.allow_large_results = True
        job_config.createDisposition = "CREATE_IF_NEEDED"

    query_job = client.query(query,job_config=job_config)
    results = query_job.result()  # Waits for job to complete.

有谁知道可能发生的情况和解决方法?

【问题讨论】:

【参考方案1】:

感谢您的回复,cmets 确实是在正确的方向。在 BigQuery 脚本中意味着 https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting.

这是不允许的,我的查询有:

DECLARE capital int64 default 10000000;

因此,在我的情况下,删除上面的行是解决方法。

有趣的是,即使在网页界面中

如果您使用脚本,界面将不允许保存到表格:

相反,当不使用脚本语句时,您应该看到:

【讨论】:

我的查询设置看起来像我无法使用脚本的第二个屏幕截图。如何更改查询设置以使用第一个屏幕截图中的脚本?【参考方案2】:

错误是自描述的。脚本不允许设置目标表 - 您应该使用 DML/DDL

解决方法是重置没有目标表的job_config

【讨论】:

只是澄清一下,在这种情况下 script 是什么意思?这和这个官方doc有什么区别? cloud.google.com/bigquery/docs/reference/standard-sql/scripting 好的,所以问题依赖于 OP 问题中的实际 SQL,不是吗?如果该查询不包含任何脚本,那么它(至少在这方面)会起作用,对吧? 当一个运行脚本或 DML/DDL - 目的地是不允许的,将导致错误 我遇到了类似的问题,不太明白 OP 解释的解决方案:***.com/questions/65590829/…

以上是关于无法使用 BigQuery Python API 设置目标表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 google-api-python-client 设置 BigQuery 配置属性?

使用 Python API 获取 BigQuery 临时表“目标表”

无法从 DataLab 连接到 Bigquery API

如何使用API 而不是使用Google BigQuery数据传输服务?

使用 python 从 bigquery 调用外部表

如何使用 Python BigQuery API 追加到 BigQuery 中的表