SQL 方言通

首页 / 聚合

APPROX_COUNT_DISTINCT 近似去重计数

APPROX_COUNT_DISTINCT 用 HyperLogLog 等算法估算去重个数,比 COUNT(DISTINCT) 省内存。Hologres、StarRocks、Doris 和 Spark 同名可用,MaxCompute 叫 APPROX_DISTINCT,Hive 和 Flink 没有内置的近似去重函数,只能用精确的 COUNT(DISTINCT)。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute别名APPROX_DISTINCT(colname)MaxCompute 2.0 扩展函数,返回 BIGINT,文档写明会有 5% 的误差。官方文档
Hologres支持APPROX_COUNT_DISTINCT(column)基于 HyperLogLog,平均误差 0.1%~1%。精度由 hg_experimental_approx_count_distinct_precision 控制,取值 12~20,默认 17。精确去重也可以用 UNIQ,它在带 GROUP BY 时比 COUNT DISTINCT 快。官方文档
StarRocks支持APPROX_COUNT_DISTINCT(expr)结果近似于 COUNT(DISTINCT col),使用固定大小的内存,适合高基数列。官方文档
Doris支持APPROX_COUNT_DISTINCT(expr)别名是 NDV。基于 HyperLogLog,只统计非 NULL 值,返回 BIGINT。官方文档
Hive需改写COUNT(DISTINCT col)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。官方文档
Spark SQL支持approx_count_distinct(expr[, relativeSD])Spark 1.6.0 起提供,基于 HyperLogLog++。relativeSD 是允许的最大相对标准差。官方文档
Flink SQL需改写COUNT(DISTINCT expr)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。官方文档

迁移注意事项

示例

按天估算访问用户数

MaxCompute
SELECT dt, APPROX_DISTINCT(user_id) AS uv FROM visits GROUP BY dt;
Hologres
SELECT dt, APPROX_COUNT_DISTINCT(user_id) AS uv FROM visits GROUP BY dt;
StarRocks
SELECT dt, APPROX_COUNT_DISTINCT(user_id) AS uv FROM visits GROUP BY dt;
Doris
SELECT dt, APPROX_COUNT_DISTINCT(user_id) AS uv FROM visits GROUP BY dt;
Hive
SELECT dt, COUNT(DISTINCT user_id) AS uv FROM visits GROUP BY dt;
Spark SQL
SELECT dt, approx_count_distinct(user_id) AS uv FROM visits GROUP BY dt;
Flink SQL
SELECT dt, COUNT(DISTINCT user_id) AS uv FROM visits GROUP BY dt;

同类函数

最后核对日期: