以下是我作为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))
这可以正常工作,但是如果该表已经存在,则会吐出一个错误。我知道如何首先删除该表,但我想知道是否有一种方法可以使该表以原子方式覆盖该表,以便该表始终存在。
谢谢!
答案 0 :(得分:2)
您可以通过设置create_disposition和write_disposition的组合来控制结果的持久性。 python库在QueryJobConfig中公开了这些选项,并链接了REST API文档中的更多详细信息。
对于查询,写伪装的默认行为是WRITE_EMPTY
,如果表已经存在,则会导致失败。将其切换为WRITE_TRUNCATE
应该可以让您原子替换所需的数据。
TL; DR: 只需将其添加到您的作业配置中即可:
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE