BQ - материализованные представления и ARRAY_AGG - PullRequest
0 голосов
/ 27 мая 2020

Я пробую материализованные представления в нашей системе обработки событий 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.

Любые советы приветствуются, надеюсь, функция, упоминаемая в сообщении об ошибке, не поддерживается, не за горами. Спасибо!

1 Ответ

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

Надеюсь, сработает:

WITH
latest_records AS
(
    SELECT entityId, SPLIT(MAX(COALESCE(EventOccurredTimestamp, '||', Col1, '||', Col2, '||', Col3)), '||') values
    FROM `project.dataset.order_events`
    GROUP BY entityId
)
SELECT 
    entityId, 
    CAST(values[offset(0)]) as timestamp) as EventOccurredTimestamp,
    values[offset(1)] as Col1, -- let's say it's string
    CAST(values[offset(2)] as bool) as Col2, -- it's bool
    CAST(values[offset(3)] as int64) as Col3 -- it's int64
FROM latest_records
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...