#python #python-3.x #google-bigquery
#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 amp; 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
Комментарии:
1. Так, например, если у меня есть данные за 3 года для загрузки, начиная, например, с
20190424
возврата20160424
, какая дата будет указана в конце для декоратора раздела? Было быsales_data$20190424
? Извините, я вроде как новичок во всей этой концепции. В принципе, я хочу постоянно обновлять исторические данные и перезаписывать данные только с той же датой.. Итак, завтра при запуске api я хотел бы перезаписать только те данные, которые уже есть в таблице за определенный день … если этого дня нет в таблице, то оставьте его как есть.2. Также для перезаписи декоратора раздела я все еще хотел бы использовать
WRITE_TRUNCATE
или что-то еще?3. Я отправил еще один вопрос, если вы могли бы взглянуть