Google BigQuery WRITE_TRUNCATE删除所有数据

时间:2019-04-24 18:57:45

标签: python python-3.x google-bigquery

我在BQ中有一个表设置,如果我在某个日期分区上写入exists的数据,我希望它覆盖它。我已经将job_config设置为使用WRITE_TRUNCATE。

#file_obj = Some ndjson StringIO file like obj

job_config = bigquery.QueryJobConfig()
# Set configuration.query.destinationTable
dest_dataset = 'test'
dest_table_name = 'sales_data'
destination_dataset = client.dataset(dest_dataset)
destination_table = destination_dataset.table(dest_table_name)
job_config.destination = destination_table

# Set configuration.query.writeDisposition & SourceFormat
job_config.write_disposition = 'WRITE_TRUNCATE'
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

# Set partitioning
time_partitioning = bigquery.table.TimePartitioning(
    bigquery.table.TimePartitioningType.DAY, 'date'
)
job_config.time_partitioning = time_partitioning

# Start the load job
job = client.load_table_from_file(
        file_obj, destination_table,
        job_config=job_config
)
# Wait for the job to finish
job.result()

但是,我注意到当回填数据时,即使日期分区不同,它也总是会覆盖表中的所有数据。例如,如果我在20190101-20190201的表中有数据,并且从20190202-Present加载了数据,则整个表将被删除,并且仅包含新数据。由于数据位于不同的分区日期,是否不应该保留这些数据?知道为什么会发生这种情况,或者我缺少什么吗?

1 个答案:

答案 0 :(得分:4)

  

有人知道为什么会发生这种情况,或者如果我缺少什么?

job_config.write_disposition ='WRITE_TRUNCATE'是整个表范围的操作-并说If the table already exists - overwrites the table data.这不考虑任何分区,并且会影响整个表

如果您需要覆盖特定的分区,则需要专门引用该分区-例如sales_data$20190202