Алгоритм подсчета - PullRequest
       41

Алгоритм подсчета

1 голос
/ 24 мая 2019

Мне интересно, возможно ли сделать приблизительный отчет следующим образом:

1. У меня есть такая агрегация:

country      unique products sold        helper_data -- limit 1MB size
US           100,000,005                 ??
CA           192,394,293                 ??

2. И мне интересно, смогу ли я получить следующее:

country        unique products sold
[ALL]          205,493,599 # possible to get this??
US             100,000,005
CA             192,394,293

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

Обратите внимание, что я не ищу SQL-подход, мне просто интересно посмотреть, возможно ли передать какой-то объект / хэш / и т.д. вернуться к каждой позиции, а затем построить приблизительный уникальный счетчик по нескольким позициям.

1 Ответ

3 голосов
/ 24 мая 2019

Ниже приведен упрощенный пример для BigQuery Standard SQL, который [я думаю] воспроизводит именно ваш вариант использования

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'us' country, 1 product_id UNION ALL
  SELECT 'us', 2 UNION ALL
  SELECT 'us', 3 UNION ALL
  SELECT 'us', 4 UNION ALL
  SELECT 'us', 5 UNION ALL
  SELECT 'ca', 3 UNION ALL
  SELECT 'ca', 4 UNION ALL
  SELECT 'ca', 5 UNION ALL
  SELECT 'ca', 6 UNION ALL
  SELECT 'ca', 7 UNION ALL
  SELECT 'ca', 8 UNION ALL
  SELECT 'ca', 9
), aggregation AS (
  SELECT country, 
    COUNT(DISTINCT product_id) unique_products_sold,
    HLL_COUNT.INIT(product_id) AS helper_data
  FROM `project.dataset.table`
  GROUP BY country
)
SELECT country, unique_products_sold FROM aggregation UNION ALL
SELECT 'all', HLL_COUNT.MERGE(helper_data) FROM aggregation 

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

Row country unique_products_sold     
1   ca      7    
2   us      5    
3   all     9    

Как видите, это довольно простозапрос, который вы можете использовать в любом предпочитаемом вами клиенте - например, в python, например

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