Google BigQuery WRITE_TRUNCATE удаляет все данные

#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. Я отправил еще один вопрос, если вы могли бы взглянуть