无法在 BigQuery 中使用 DML 语句的作业中设置目标表

Posted

技术标签:

【中文标题】无法在 BigQuery 中使用 DML 语句的作业中设置目标表【英文标题】:Cannot set destination table in jobs with DML statements in BigQuery 【发布时间】:2019-04-04 08:32:04 【问题描述】:

我正在编写 Python 代码以使用 bigquery.Client.query 执行 BigQuery sql 命令。我收到Cannot set destination table in jobs with DML statements异常。

下面是我正在使用的 Python 代码

if query_file_name:
    with open(query_file_name, mode="r") as query_file:
        query = query_file.read()

job_config = bigquery.QueryJobConfig()
job_config.use_legacy_sql = use_legacy_sql

if destination:
    if destination.partitioned_field:
        job_config.time_partitioning = TimePartitioning(type_=TimePartitioningType.DAY, 
                                         field=destination.partitioned_field)
google_bq_table = self.fetch_table_reference(destination)
job_config.destination = google_bq_table

job_config.write_disposition = WriteDisposition.WRITE_APPEND

query_job = self.google_client.query(query, job_config=job_config)  # API request - starts the query asynchronously

我有如下 BigQuery sql 中的 query_file

INSERT mydataset.target_table
        (col1, col2, col3, created_date)
WITH T AS (SELECT col1, col2, col3, CURRENT_DATE() as created_date
            from mydataset.temp_table
           )
SELECT col1, col2, col3, created_date FROM T

提前感谢您的帮助

谢谢,

拉古纳特。

【问题讨论】:

查看这个与您的问题相似的问题***.com/q/55166634/1031958,如果这能解决您的问题,请告诉我们 @TamirKlein 感谢分享,我正在执行 2 个依赖的查询。不能单独执行。你能帮忙解决这个问题吗 好的,所以在另一次审查后阅读您的代码示例我不确定我是否理解您的用例。您正在插入一个表,但您还将结果保存在目标表job_config.destination = google_bq_table,这是什么原因? @TamirKlein:感谢您的提问。我是 BigQuery 的新手。我已经编写了试图将数据插入同一个表两次的代码。我删除了 INSERT mydataset.target_table (col1, col2, col3, created_date),解决了这个问题。 太好了,让其他人看到我发布了一个答案,如果你能接受并投票,那将是很棒的。很高兴听到我的回答对您有所帮助。 【参考方案1】:

无法在具有 DML 语句的作业中设置目标表

作为 BigQuery 错误消息中的统计信息,您无法在运行插入命令时在 Python 代码目标对象中进行设置。

删除这行

if destination:
    if destination.partitioned_field:
        job_config.time_partitioning = TimePartitioning(type_=TimePartitioningType.DAY, 
                                         field=destination.partitioned_field)
google_bq_table = self.fetch_table_reference(destination)
job_config.destination = google_bq_table

从您的代码中将解决您的问题

【讨论】:

【参考方案2】:

BigQuery 应低于 1,而不是问题中的 1。通过以下查询,我能够成功地将数据加载到目标表。

WITH T AS (SELECT col1, col2, col3, CURRENT_DATE() as created_date
            from mydataset.temp_table
           )
SELECT col1, col2, col3, created_date FROM T

【讨论】:

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

BigQuery INSERT DML 语句限制

Bigquery DML - SQL 输出

如何使用 DML 语法在 BigQuery 中插入带有 RECORD 字段的记录?

如果表在保留期内被删除,Bigquery 是不是收费?

在BigQuery中封装复杂代码

BigQuery:使用 DML 原子地替换日期分区