Материализованный вид BigQuery — проблема с ARRAY_AGG

#google-bigquery

#google-bigquery

Вопрос:

Мы пытаемся использовать ARRAY_AGG в качестве шаблона для МАТЕРИАЛИЗОВАННЫХ представлений, чтобы получить «последнее» событие продукта для данного идентификатора продукта.

Приведенный ниже SQL является стандартным шаблоном (хорошо документированным на этом сайте) и работает сам по себе, но в контексте BigQuery MVs завершается ошибкой с прикрепленной ошибкой.

По сути, мы хотим использовать этот тип SQL в материализованном представлении, где «latest» постепенно обновляется с помощью BQ MV, а не альтернативу запросов расписания для повторной обработки всех событий в product_events?

 CREATE MATERIALIZED VIEW `project.product_events_latest`
AS
SELECT
  ARRAY_AGG(
    e ORDER BY PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", event.eventOccurredTime) DESC LIMIT 1
  )[OFFSET(0)].*
FROM
  `project.product_events` e
GROUP BY
  e.productEvent.product.id
 

введите описание изображения здесь

Я не уверен, что такое неподдерживаемая функция, и если есть способ переписать, чтобы заставить ее работать по-другому, или просто пока невозможно? Любая помощь приветствуется!

Ответ №1:

В настоящее время материализованный вид BigQuery не поддерживает смещение и другие пост-вычисления, присутствующие поверх агрегатных функций.

Вместо этого переместите [СМЕЩЕНИЕ (0)] в обычный вид поверх материализованного вида

Комментарии:

1. Я нахожу, даже если я удаляю СМЕЩЕНИЕ [0].* operator, чтобы оставить структуру, я получаю еще одну ошибку неподдерживаемого оператора ‘Struct’ К вашему сведению. Часть ‘struct’ является самой большой блокировкой, поскольку нам нужно полное событие, а не 1 поле, поскольку без смещения мы могли бы поместить другое представление поверх для выполнения смещения. СОЗДАЙТЕ МАТЕРИАЛИЗОВАННЫЙ ВИД product.product_events_latest КАК SELECT ARRAY_AGG( e ORDER BY PARSE_TIMESTAMP(«%Y-%m-%dT%H:%M:% E * S%Ez», event.eventOccurredTime) ОГРАНИЧЕНИЕ 1 ) КАК LatestProduct ИЗ product.product_events ГРУППЫ e ПО e.productEvent.product.id