BigQuery материализованный взгляд на структуру - PullRequest
0 голосов
/ 15 апреля 2020

Мы пытаемся создать материализованное представление большой таблицы BQ. Таблица получает большой объем потоковых вставок веб-активности, является мультитенантной и действительно использует вложенную столбчатую структуру BQ.

Мы хотим создать подмножество этой таблицы для более эффективного выполнения запросов практически в реальном времени. с минимальными административными издержками. Мы думали, что самым простым решением было бы создать материализованное представление, представляющее собой лишь подмножество строк (по клиенту) и столбцов, но в настоящее время материализованные представления требуют агрегирования.

Кроме того, бета-версия материализованного представления поддерживает ограниченный набор агрегирует функции и не поддерживает подвыборы или операции UNNEST. Мы не нашли хорошего метода извлечения глубоко вложенных структур в материализованное представление. Простой пример:

SELECT 
  '7602E3E96349E972' as session_id,
  '084F0262' as transaction_id,
  [STRUCT(
    [STRUCT(
      'promotions' as name,
      ['SAVE50'] as value), 
      STRUCT(
        'discounts' as name,
        ['9.99'] as value)
    ] as modifiers
  )] as contexts_transaction
UNION ALL
SELECT 
  '7602E3E96349E972' as session_id,
  '01ECB6EF' as transaction_id,
  [STRUCT(
    [STRUCT(
      'promotions' as name,
      ['SPRING','LOVE'] as value), 
      STRUCT(
        'discounts' as name,
        ['14.99','6.99'] as value)
    ] as modifiers
  )] as contexts_transaction
UNION ALL
SELECT 
  '508082BC49BAC09F' as session_id,
  '038B67CF' as transaction_id,
  [STRUCT(
    [STRUCT(
      'promotions' as name,
      ['FREESHIP','HOLIDAY25'] as value), 
      STRUCT(
        'discounts' as name,
        ['9.99'] as value)
    ] as transaction
  )] as contexts_transaction
UNION ALL
SELECT 
  'C88AE153C784D910' as session_id,
  'EA716BD2' as transaction_id,
  [STRUCT(
    [STRUCT(
      'promotions' as name,
      ['CYBER'] as value), 
      STRUCT(
        'discounts' as name,
        ['9.99','19.99'] as value)
    ] as modifiers
  )]

В этом идеале мы хотели бы сохранить эту СТРУКТУРУ как есть, мы пытаемся выполнить sh нечто подобное в материализованном представлении (признавая, что это не поддерживаемые функции MV):

SELECT
session_id,
transaction_id,
ARRAY_AGG(STRUCT<name STRING, value ARRAY<STRING>>(mods_array.name,mods_array.value)) as modifiers
FROM data,
UNNEST(contexts_transaction) trans_array,
UNNEST(trans_array.modifiers) mods_array
GROUP BY 1,2

Мы открыты для любого метода подстановки этой массивной таблицы, не только MV, но хотели бы, чтобы она имела такие же преимущества (низкие эксплуатационные расходы, автоматизация c, низкая стоимость). Любые предложения приветствуются!

1 Ответ

0 голосов
/ 15 апреля 2020

Насколько я понял из вашего вопроса, вы хотите получить вывод, похожий на этот:

with rawdata AS
(
  SELECT 1 as userid, [STRUCT('transactionIds' as name, ['ABCDEF'] as value), STRUCT('couponIds' as name, ['123456'] as value)] as transactions union all
  SELECT 1 as userid, [STRUCT('transactionIds' as name, ['XYZ', 'KLM'] as value), STRUCT('couponIds' as name, ['789', '567'] as value)] union all
  SELECT 2 as userid, [STRUCT('transactionIds' as name, ['XY', 'KL'] as value), STRUCT('couponIds' as name, ['10', '15'] as value)] union all
  SELECT 2 as userid, [STRUCT('transactionIds' as name, ['X', 'K'] as value), STRUCT('couponIds' as name, ['20', '25'] as value)]
)
select 
  userid,
  ARRAY_CONCAT_AGG((SELECT trx.value FROM UNNEST(transactions) trx WHERE trx.name = 'transactionIds')) as transactionIds,
  ARRAY_CONCAT_AGG((SELECT trx.value FROM UNNEST(transactions) trx WHERE trx.name = 'couponIds')) as couponIds
from rawdata
group by userid;

Итак, таблица ввода выглядит следующим образом
Sample input table

В то время как выходная таблица выглядит следующим образом:
Sample output table

Если ваше намерение иное, укажите это в вопросе с более подробной информацией.

С этой целью я попытался создать этот запрос как материализованное представление.

create or replace table project.dataset.rawdata as 
  SELECT 1 as userid, [STRUCT('transactionIds' as name, ['ABCDEF'] as value), STRUCT('couponIds' as name, ['123456'] as value)] as transactions union all
  SELECT 1 as userid, [STRUCT('transactionIds' as name, ['XYZ', 'KLM'] as value), STRUCT('couponIds' as name, ['789', '567'] as value)] union all
  SELECT 2 as userid, [STRUCT('transactionIds' as name, ['XY', 'KL'] as value), STRUCT('couponIds' as name, ['10', '15'] as value)] union all
  SELECT 2 as userid, [STRUCT('transactionIds' as name, ['X', 'K'] as value), STRUCT('couponIds' as name, ['20', '25'] as value)]
;

create materialized view project.dataset.mview as 
select 
  userid,
  ARRAY_CONCAT_AGG((SELECT trx.value FROM UNNEST(transactions) trx WHERE trx.name = 'transactionIds')) as transactionIds,
  ARRAY_CONCAT_AGG((SELECT trx.value FROM UNNEST(transactions) trx WHERE trx.name = 'couponIds')) as couponIds
from project.dataset.rawdata
GROUP BY userid

Однако я получаю ошибку Unsupported aggregation function in materialized view: array_concat_agg.. Поскольку материализованные представления еще бета, мы не знаем, будет ли это поддерживаться в будущем. Однако это невозможно сделать с текущими возможностями.

@ fhoffa может рассказать об этом больше, может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...