Простой счетчик различий между массивами Bigquery без использования HLL или UDF - PullRequest
0 голосов
/ 06 декабря 2018

Как и в примере, приведенном ниже, я хочу различить счет по массивам BigQuery: Отличить счет по массивам Bigquery

Однако у меня есть несколько дополнительных требований, которые делают решение, представленное в этомсообщение выполнимо для меня:

  • Решение должно не использовать UDF ( слишком медленно )
  • Решение должно не использовать функцию HLL ( должен быть точным)
  • Решение должно не использовать шаблон ВЫБРАТЬ из ВЫБРАТЬ, отображаемый в связанном решении, для агрегирования по гибкой группе измерений, выбранной конечным пользователем с помощью инструмента BI

Итак, пока этот расширенный пример (содержит пользователя как измерение группировки) работает с использованием HLL:

#standardSQL
WITH
  test AS (
  SELECT
    'A' AS User, DATE('2018-01-01') AS ReportDate, 2 AS value, [1,2,3] AS key
  UNION ALL
  SELECT
    'A' AS User, DATE('2018-01-02') AS ReportDate, 3 AS value, [1,4,5] AS key
  UNION ALL
  SELECT
    'B' AS User, DATE('2018-01-02') AS ReportDate, 4 AS value, [4,5,6,7,8] AS key
  UNION ALL
  SELECT
    'B' AS User, DATE('2018-01-02') AS ReportDate, 5 AS value, [3,4,5,6,7] AS key )
SELECT
  User,
  SUM(value) total_value,
  HLL_COUNT.MERGE((
    SELECT
      HLL_COUNT.INIT(key)
    FROM
      UNNEST(key) key)) AS unique_key_count
FROM
  test
GROUP BY
  user

Мне нужна версия, которая выполняет этот отдельный агрегатный подсчет массивов с требованиями, упомянутыми выше.

Опять же, это означает, что он также должен работать должным образом, если я группирую только по ReportDate , комбинации User / ReportDate или сценарию, в котором этот пример расширен дополнительнымиразмеры.

1 Ответ

0 голосов
/ 06 декабря 2018
#standardSQL
WITH test AS
(
  SELECT 'A' AS User, DATE('2018-01-01') AS ReportDate, 2 AS value, [1,2,3] AS key UNION ALL
  SELECT 'A' AS User, DATE('2018-01-02') AS ReportDate, 3 AS value, [1,4,5] AS key UNION ALL
  SELECT 'B' AS User, DATE('2018-01-02') AS ReportDate, 4 AS value, [4,5,6,7,8] AS key UNION ALL
  SELECT 'B' AS User, DATE('2018-01-02') AS ReportDate, 5 AS value, [3,4,5,6,7] AS key  
)
SELECT 
  User,
  SUM(IF(flag=0, value, 0)) total_value,
  COUNT(DISTINCT key) unique_key_count
FROM test, UNNEST(key) key WITH OFFSET flag
GROUP BY User   

с результатом

Row User    total_value unique_key_count     
1   A       5           5    
2   B       9           6    
...