Пересечение на большом количестве данных без BigQuery

У меня есть таблица (в Google BigQuery), показывающая URL-адрес, который посещают люди. Люди представлены 10-символьным идентификатором.

Если пользователь посетил URL-адрес один раз, в таблице будет 1 строка. Есть около 90 миллионов уникальных людей (id) и около 400 тысяч уникальных доменов.

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

Дело в том, что некоторые люди могли посещать несколько доменов. Таким образом, общая сумма будет неправильной. У меня есть версия, в которой я просто получаю количество уникальных идентификаторов, посетивших домен для каждого домена, а затем в интерфейсе я просто добавляю к общему количеству, когда выбран веб-сайт, и удаляю из общего количества, когда домен не выбран. Конечно, это не решает проблему двойного подсчета идентификаторов.

Большое количество доменов не позволяет просто вычислить каждое возможное пересечение. Также я хочу запросить BigQuery только один раз из соображений скорости и стоимости. Я чувствую, что нет реального решения без использования BigQuery после каждого выбора, может ли кто-нибудь сказать мне, если я что-то пропустил?

Спасибо


person Community    schedule 17.12.2019    source источник


Ответы (1)


Я думаю, вы ищете функциональность ROLLUP в GROUP BY: https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#group-by-clause

Пример:

WITH Sales AS (
  SELECT  1 AS day, 'abc' AS user UNION ALL
  SELECT  1, 'abc' UNION ALL
  SELECT  1, 'def' UNION ALL
  SELECT  2, 'abc' UNION ALL
  SELECT  3, 'abc' UNION ALL
  SELECT  3, 'def' UNION ALL
  SELECT  3, 'abc'
)
SELECT
  day,
  COUNT(distinct user) AS total
FROM Sales
GROUP BY ROLLUP(day);
person Martin Weitzmann    schedule 17.12.2019
comment
Здравствуйте, спасибо за ваш ответ! Я думаю, что ваш запрос должен помочь мне запросить объем для каждого домена из BigQuery, верно? Проблема здесь не в том, чтобы запрашивать из BigQuery, а в том, что я должен запрашивать из BigQuery, который был бы достаточно мал, чтобы позволить мне делать то, что я хочу (отображение нового общего объема без дублирования при добавлении/удалении домена). из выбора на интерфейсе) если бы я манипулировал, скажем, в Python? Не могли бы вы сказать мне, какой результат вы ожидаете с вашим запросом, пожалуйста? Может я неправильно понял. - person ; 17.12.2019
comment
rollup позволяет запрашивать различные итоги в группах и по группам. Так что вам не нужны обходные пути. Попробуйте и внимательно изучите документацию - я думаю, это решит вашу проблему. - person Martin Weitzmann; 17.12.2019