#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