Даже если бы строки не было в буфере потоковой передачи, это не было бы способом решения этой проблемы в BigQuery.Хранилище BigQuery лучше подходит для массовых мутаций, чем для мутаций отдельных объектов, таких как UPDATE
.Ваш шаблон соответствует тому, что я ожидал от транзакционного, а не аналитического варианта использования.
Для этого рассмотрим шаблон на основе дополнений.Каждый раз, когда вы обрабатываете сообщение объекта, пишите его в BigQuery с помощью потоковой вставки.Затем, при необходимости, вы можете получить последнюю версию всех сущностей с помощью запроса.
В качестве примера давайте предположим произвольную схему: idfield
- это ваш уникальный ключ / идентификатор объекта, а message_time
представляет время, когда было отправлено сообщение.У ваших сущностей может быть много других полей.Чтобы получить последнюю версию сущностей, мы могли бы выполнить следующий запрос (и, возможно, записать его в другую таблицу):
#standardSQL
SELECT
idfield,
ARRAY_AGG(
t ORDER BY message_time DESC LIMIT 1
)[OFFSET(0)].* EXCEPT (idfield)
FROM `myproject.mydata.mytable` AS t
GROUP BY idfield
Дополнительным преимуществом этого подхода является то, что он также позволяет выполнять анализ впроизвольные моменты времени.Чтобы выполнить анализ сущностей по состоянию на час назад, просто добавьте предложение WHERE: WHERE message_time <= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)