谷歌 BigQuery WRITE_TRUNCATE 删除所有数据
Posted
技术标签:
【中文标题】谷歌 BigQuery WRITE_TRUNCATE 删除所有数据【英文标题】:Google BigQuery WRITE_TRUNCATE erasing all data 【发布时间】:2019-04-24 18:57:45 【问题描述】:我在 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】:知道为什么会发生这种情况,或者我错过了什么吗?
job_config.write_disposition = 'WRITE_TRUNCATE' 是整个表范围的操作 - 并说 If the table already exists - overwrites the table data.
这不考虑任何分区并影响整个表
如果您需要覆盖特定分区,您需要专门引用该分区 - 例如sales_data$20190202
【讨论】:
例如,如果我有 3 年的数据要加载,例如从20190424
回到 20160424
,那么分区装饰器的最后日期是什么?会是sales_data$20190424
吗?抱歉,我对整个概念有点陌生。基本上我想在滚动的基础上保留完整的历史数据,并且只覆盖具有相同日期的数据。所以明天在运行 api 时,我只想覆盖某一天表中已经存在的任何数据......如果那一天不在表格中,则保持原样。
对于分区装饰器覆盖,我还想使用WRITE_TRUNCATE
还是别的什么?
我提交了另一个问题,请您看看以上是关于谷歌 BigQuery WRITE_TRUNCATE 删除所有数据的主要内容,如果未能解决你的问题,请参考以下文章