【问题标题】:BigQuery: Count elements in APPROX_QUNATILESBigQuery:计算 APPROX_QUNATILES 中的元素
【发布时间】:2019-10-20 00:31:25
【问题描述】:

我想知道是否有一种方法可以计算在APPROX_QUANTILES 创建的存储桶中找到了多少元素?我想我真正在寻找的是一种在 BigQuery 标准 SQL 中创建直方图的方法。有没有办法这样做?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    问题的标题是“计算 APPROX_QUANTILES 中的元素”,我将回答这个问题。因为你的最终目标是to build a histogram, please see this question

    要计算每个桶中的元素数量,我们可以这样做:

    WITH data AS ( 
        SELECT *, ActualElapsedTime datapoint
        FROM `fh-bigquery.flights.ontime_201903`
        WHERE FlightDate_year = "2018-01-01" 
        AND Origin = 'SFO' AND Dest = 'JFK'
      )
      , quantiles AS (
      SELECT *, IFNULL(LEAD(bucket_start) OVER(ORDER BY bucket_i) , 0100000) bucket_end
      FROM UNNEST((
        SELECT APPROX_QUANTILES(datapoint, 10)
        FROM data
      )) bucket_start WITH OFFSET bucket_i
    ) 
    
    SELECT COUNT(*) count, bucket_i
      , ANY_VALUE(STRUCT(bucket_start, bucket_end)) b, MIN(datapoint) min,  MAX(datapoint) max
    FROM data
    JOIN quantiles
    ON data.datapoint >= bucket_start AND data.datapoint < bucket_end
    GROUP BY bucket_i
    ORDER BY bucket_i
    

    可视化,我们得到类似的东西:

    这告诉我们:

    • 不要使用APPROX_QUANTILES 来构建直方图,因为每个桶最终会包含大约相同数量的元素。这就是分位数的目标。
    • APPROX_QUANTILES 非常“近似”。如您所见,每个分位数的元素数量并不相同。
    • 从旧金山国际机场飞往肯尼迪国际机场大约需要 305 到 357 分钟。

    【讨论】:

      【解决方案2】:

      我认为您可能需要 APPROX_TOP_COUNT function 代替,它会返回最高元素的频率,直至您提供的限制。

      来自文档:

      SELECT APPROX_TOP_COUNT(x, 2) as approx_top_count
      FROM UNNEST(["apple", "apple", "pear", "pear", "pear", "banana"]) as x;
      
      +-------------------------+
      | approx_top_count        |
      +-------------------------+
      | [{pear, 3}, {apple, 2}] |
      +-------------------------+
      

      【讨论】:

      • 不,因为我有一个连续的数字范围,而不是分类选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2015-02-11
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多