不重复计数算法

时间:2019-05-24 01:04:02

标签: python algorithm google-bigquery hyperloglog

我想知道是否可以通过以下方式进行近似的计数:

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 个答案:

答案 0 :(得分:3)

下面是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