Поддержание актуальности данных таблиц BigQuery - PullRequest
1 голос
/ 08 мая 2020

Вероятно, это неправильный вариант использования BigQuery, но у меня возникла следующая проблема: мне нужно периодически обновлять таблицу Big Query. Обновление должно быть «atomi c» в том смысле, что клиенты, которые читают данные, должны использовать либо только старую версию данных, либо полностью новую версию данных. Единственное решение, которое у меня есть сейчас, - это использовать разделы даты. Проблема с этим решением заключается в том, что клиенты, которым просто нужно читать последние данные, должны знать о разделах и получать данные только с определенных разделов. Каждый раз, когда я хочу сделать запрос, мне нужно сначала выяснить, какой раздел использовать, и только потом выбирать из таблицы. Есть ли способ улучшить это? В идеале я хотел бы, чтобы решение было простым и прозрачным для клиентов, которые читают данные.

1 Ответ

1 голос
/ 10 мая 2020

Вы не упомянули размер вашего обновления, я могу дать лишь некоторые общие рекомендации.

  1. Большинство обновлений BigQuery, включая одиночный DML (INSERT / UPDATE / DELETE / MERGE) и одиночное задание загрузки, относятся к atomi c. Ваш ридер читает либо старые данные, либо новые данные.
  2. В данный момент транзакция с несколькими операторами отсутствует, и если у вас есть обновления, которые не подходят для одного задания загрузки, решение:
    1. Загрузить обновление в промежуточную таблицу после завершения всех загрузок
    2. Используйте одиночный INSERT или MERGE для объединения обновлений из промежуточной таблицы в первичную таблицу данных
    3. Недостаток: сканирование промежуточной таблицы не бесплатно

Обновление: поскольку у вас есть несколько таблиц для атомарного обновления, есть небольшая уловка, которая может быть полезна.

Предполагая, что для каждой таблицы вам нужно обновление, есть - столбец ActivePartition в качестве ключа раздела, у вас может быть таблица только с одной строкой.

CREATE TABLE ActivePartition (active DATE);

Каждый раз после загрузки вы устанавливаете ActivePartition.active на новую активную дату, затем ваш пользователь использует скрипт:

DECLARE active DATE DEFAULT (SELECT active FROM ActivePartition);

-- Actual query
SELECT ... FROM dataTable WHERE ActivePartition = active
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...