如何在BigQuery客户端Python API中以原子方式覆盖表

时间:2018-09-01 23:32:04

标签: python google-bigquery

以下是我作为GCP文档参考的代码段:

job_config = bigquery.QueryJobConfig()
# Set the destination table
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

这可以正常工作,但是如果该表已经存在,则会吐出一个错误。我知道如何首先删除该表,但我想知道是否有一种方法可以使该表以原子方式覆盖该表,以便该表始终存在。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以通过设置create_disposition和write_disposition的组合来控制结果的持久性。 python库在QueryJobConfig中公开了这些选项,并链接了REST API文档中的更多详细信息。

对于查询,写伪装的默认行为是WRITE_EMPTY,如果表已经存在,则会导致失败。将其切换为WRITE_TRUNCATE应该可以让您原子替换所需的数据。

TL; DR: 只需将其添加到您的作业配置中即可:

job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE