HyperLogLog函数为近似聚合函数,类似于approx_distinct函数。当计算的数据量非常大时,使用HyperLogLog函数可快速返回估算结果。本文介绍HyperLogLog函数的基本语法以及示例。
日志服务支持如下HyperLogLog函数。
|
函数名称 |
语法 |
说明 |
支持SQL |
支持SPL |
|
approx_set(x) |
估算x中不重复值的个数,最大标准误差默认为0.01625。 |
√ |
× |
|
|
cardinality(x) |
将HyperLogLog类型的内容转换为bigint类型。 |
√ |
× |
|
|
empty_approx_set() |
返回一个HyperLogLog类型的空值。最大标准误差默认为0.01625。 |
√ |
× |
|
|
merge(x) |
聚合计算所有的HyperLogLog值。 |
√ |
× |
approx_set函数
approx_set函数用于估算x中不重复值的个数,最大标准误差默认为0.01625。
语法
approx_set(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为任意数据类型。 |
返回值类型
HyperLogLog类型。
示例
使用approx_set函数估算每分钟的网站访问UV,返回结果为HyperLogLog编码格式。
-
查询和分析语句
* | SELECT date_trunc('minute', __time__) AS Time, approx_set(client_ip) AS UV FROM website_log GROUP BY Time ORDER BY Time -
查询和分析结果:查询结果返回
Time和UV两列,其中Time列为按分钟截断的时间戳,UV列为approx_set函数返回的近似集合编码字符串,共 16 条记录。
cardinality函数
cardinality函数用于将HyperLogLog类型的内容转换为bigint类型。
语法
cardinality(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为HyperLogLog类型。 |
返回值类型
bigint类型。
示例
使用approx_set函数估算每分钟的网站访问UV,返回结果为HyperLogLog类型。然后使用cardinality函数将HyperLogLog类型转换为bigint类型。
-
查询和分析语句
* | SELECT Time, cardinality(UV) AS UV FROM ( SELECT date_trunc('minute', __time__) AS Time, approx_set(client_ip) AS UV FROM website_log GROUP BY Time ORDER BY Time ) AS UV -
查询和分析结果以表格形式展示 Time 和 UV 两列,按分钟粒度列出各时间点的独立访客数,例如 2021-09-09 15:12:00 对应 UV 为 78、15:13:00 对应 UV 为 561 等。
empty_approx_set函数
empty_approx_set函数用于返回一个HyperLogLog类型的空值。最大标准误差默认为0.01625。
语法
empty_approx_set()
返回值类型
HyperLogLog类型。
示例
返回一个HyperLogLog类型的空值。
-
查询和分析语句
* | SELECT empty_approx_set() -
查询和分析结果返回结果为单列
_col0,值为AgwAAA==(Base64 编码的空 ApproxSet)。
merge函数
merge函数用于聚合计算所有的HyperLogLog值。
语法
merge(x)
参数说明
|
参数 |
说明 |
|
x |
参数值为HyperLogLog类型。 |
返回值类型
HyperLogLog类型。
示例
使用approx_set函数估算每分钟的网站访问UV,使用merge函数聚合计算15分钟内所有的UV,然后使用cardinality函数将HyperLogLog类型转换为bigint类型。
-
查询和分析语句
* | SELECT Time, cardinality(UV) AS UV, cardinality(merge(UV) over()) AS Total_UV FROM ( SELECT date_trunc('minute', __time__) AS Time, approx_set(client_ip) AS UV FROM log GROUP BY Time ORDER BY Time ) -
查询和分析结果。查询结果示例:每分钟 UV 值分别为 561、658、625、852、594、644、562、607、611 等,全局 Total_UV 为 8564,所有行的 Total_UV 值相同。