Как обновить таблицу BigQuery данными из локального файла CSV при использовании Python?Python

Программы на Python
Anonymous
Как обновить таблицу BigQuery данными из локального файла CSV при использовании Python?

Сообщение Anonymous »

Каждый день я переношу данные из базы данных MySQL в BigQuery. Для большинства процессов я использую LoadJobConfig().writedisposition с WRITE_APPEND. Однако для моей таблицы raw_stock использование WRITE_APPEND не работает, поскольку вместо этого мне нужно обновить существующие данные.
У меня есть локальный файл в формате .csv. с заголовком, содержащим только те строки, которые необходимо обновить. Они идентифицируются id_store и id_product (которые образуют составной первичный ключ). Столбцы, которые необходимо обновить, — это product_amount и date_update.
Весь процесс выполняется с помощью Python. Необходимые библиотеки и учетные данные уже настроены.
Мои попытки приводили либо к удалению и замене данных, либо к добавлению новых строк. Мне конкретно нужны обновления и ничего больше. Я пытался найти информацию в документации, предоставленной GCP, но не смог найти правильный ответ.
Я все еще новичок в этой области и не знаю, как обращаться с обновлениями. Может ли кто-нибудь мне помочь?
Заранее спасибо.



Обновление от 24 /07:
Я попытался реализовать решение, подобное предложенному jmorl96. В итоге получилось немного иначе. Вот код:

Код: Выделить всё

df = pd.read_csv(csv_file)
updated_rows = 0
for index, row in df.iterrows():
id_product = row['id_product']
id_store = row['id_store']
date_update = row['date_update']
product_amount = row['product_amount']
query = f'''
UPDATE {projeto}.{dataset}.{table}
SET date_update = '{date_update}',
product_amount = {product_amount}
WHERE id_product = {id_product} AND id_store = {id_store}
'''
try:
update_job = client.query(query)
update_job.result()
print(f"{table} updated.")
updated_rows += update_job.num_dml_affected_rows
except Exception as e:
print(f'Error while updateing {nova_tabela}: {e}')
Однако я заметил потенциально серьезную проблему. Для вступления в силу каждой обновленной строки требовалось около полсекунды. Учитывая, что у меня ежедневно появляется около двух тысяч обновлений, меня беспокоит общее время, которое займет этот процесс, но, что еще важнее, меня беспокоят связанные с этим затраты, учитывая, что мы имеем дело со средой GCP.Я почти думаю, что, возможно, в этом случае лучшей идеей было бы создать файл .CSV со всей исходной таблицей MySQL в конце дня и, используя LoadJobConfig, настроенный на WRITE_TRUNCATE, перезаписать данные соответствующей таблицы. Думаю, это будет экономичнее и быстрее, чем делать обновления по одному. Что ты думаешь?

Подробнее здесь: https://stackoverflow.com/questions/787 ... sing-pytho

Вернуться в «Python»