【发布时间】:2019-10-20 00:31:25
【问题描述】:
我想知道是否有一种方法可以计算在APPROX_QUANTILES 创建的存储桶中找到了多少元素?我想我真正在寻找的是一种在 BigQuery 标准 SQL 中创建直方图的方法。有没有办法这样做?
【问题讨论】:
标签: google-bigquery
我想知道是否有一种方法可以计算在APPROX_QUANTILES 创建的存储桶中找到了多少元素?我想我真正在寻找的是一种在 BigQuery 标准 SQL 中创建直方图的方法。有没有办法这样做?
【问题讨论】:
标签: google-bigquery
问题的标题是“计算 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 非常“近似”。如您所见,每个分位数的元素数量并不相同。【讨论】:
我认为您可能需要 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}] |
+-------------------------+
【讨论】: