Я пробую материализованные представления в нашей системе обработки событий BQ, но столкнулся с препятствием.
Для контекста:
В наших таблицах загрузки исходных событий используются только потоковые вставки (только добавление), разделенные время события (более или менее истинное время, но всегда в порядке WRT сущности, участвующей в потоке событий), и мы извлекаем «последнее» / самое последнее полное состояние данной сущности. Я чувствую, что с добавлением только данных и неизменной историей здесь могут быть преимущества, но в настоящее время они не могут работать (пока) сущность есть. Этот последний объект встроен в полезные данные самого последнего события, полученного в этой таблице, например, OrderAccepted, затем более поздних событий OrderItemsDespatched (для того же OrderId), событие OrderItemsDespatched будет иметь самый последний моментальный снимок заказа (постобработка отправки элементов ).
Таким образом, в BQ for BI нам нужно отобразить самое текущее состояние этого порядка. например, нам нужно извлечь структуру заказа из события OrderItemsDespatched, поскольку это самое последнее событие.
Это может включать функцию c analyti:
(ROW_NUMBER() OVER entityId ORDER BY EventOccurredTimestamp DESC)
и выбрать row = 1 - однако функции analyti c не поддерживаются MV и все равно не так эффективны, как ARRAY_AGG ниже
CREATE MATERIALIZED VIEW dataset.order_events_latest_mv
PARTITION BY EventOccurredDate
CLUSTER BY OrderId
AS
WITH ord_events AS (
SELECT
oe.*,
orderEvent.latestOrder.id AS OrderId,
PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", event.eventOccurredTime) AS EventOccurredTimestamp,
EXTRACT(DATE FROM PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", event.eventOccurredTime)) AS EventOccurredDate,
FROM
`project.dataset.order_events` oe
),
ord_events_latest AS (
SELECT
ARRAY_AGG(
e ORDER BY EventOccurredTimestamp DESC LIMIT 1
)[OFFSET(0)].*
FROM
ord_events e
GROUP BY
e.OrderId
)
SELECT
*
FROM
ord_events_latest
Однако есть ошибка
Materialized view query contains unsupported feature.
По сути, мы могли бы сохранить чертовски много текущей обработки и затрат только на обработку измененных данных, а не на сканирование всех данных каждый раз, что с учетом только добавления, секционированной исходной таблицы кажется выполнимым?
logi c будет очень похожим для дедупликации наших событий, что мы также делаем с немного другим запросом, но также с использованием ARRAY_AGG.
Любые советы приветствуются, надеюсь, функция, упоминаемая в сообщении об ошибке, не поддерживается, не за горами. Спасибо!