【问题标题】:Distinct Count algorithm不同计数算法
【发布时间】:2019-05-24 01:04:01
【问题描述】:

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

  1. 我有一个这样的聚合:
  +---------+----------------------+-------------------------------+
  | country | unique products sold | helper_data -- limit 1MB size |
  +---------+----------------------+-------------------------------+
  | US      | 100,000,005          | ??                            |
  | CA      | 192,394,293          | ??                            |
  +---------+----------------------+-------------------------------+
  1. 我想知道我是否可以获得以下信息:
  +---------+--------------------------------------+
  | country |         unique products sold         |
  +---------+--------------------------------------+
  | [ALL]   | 205,493,599 # possible to get this?? |
  | US      | 100,000,005                          |
  | CA      | 192,394,293                          |
  +---------+--------------------------------------+

换句话说,如果不传递所有值(有太多而且我没有足够的内存来处理它),是否可以为每个特定区域的行项目传递某种哈希(或其他东西) ,以近似在多个项目之间相加时的近似不同计数是多少?或者这是不可能的。

请注意,我不是在寻找 sql 方法,我只是想看看它是否可以传递某种对象/哈希/等。返回每个订单项,然后在多个订单项中建立一个近似的唯一计数。

【问题讨论】:

  • 您正在寻找 HyperLogLog++ Functions in Standard SQL - 它完全符合您的要求
  • @MikhailBerlyant 能否请您展示一下这是如何完成的 - 在 BigQuery 中执行 HLL,然后在其外部执行 count_merge(例如在 python 中?)
  • 我不是 python 人,但可以用 sql (BigQuery SQL) 告诉你

标签: python algorithm google-bigquery hyperloglog


【解决方案1】:

下面是 BigQuery 标准 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)中使用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 2020-11-23
    • 2013-05-08
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多