本文介绍估算函数的基本语法及示例。
日志服务支持如下估算函数。
|
函数名称 |
语法 |
说明 |
支持SQL |
支持SPL |
|
approx_distinct(x) |
估算x中不重复值的个数,默认存在2.3%的标准误差。 |
√ |
× |
|
|
approx_distinct(x, e) |
估算x中不重复值的个数,支持自定义标准误差。 |
√ |
× |
|
|
approx_percentile(x, percentage) |
对x进行正序排列,返回大约处于percentage位置的x。最终的结果是近似结果,不保证稳定性和一致性。 |
√ |
× |
|
|
approx_percentile(x, array[percentage01, percentage02...]) |
对x进行正序排列,返回大约处于percentage01、percentage02位置的x。最终的结果是近似结果,不保证稳定性和一致性。 |
√ |
× |
|
|
approx_percentile(x, weight, percentage) |
对x和权重的乘积进行正序排列,返回大约处于percentage位置的x。最终的结果是近似结果,不保证稳定性和一致性。 |
√ |
× |
|
|
approx_percentile(x, weight, array[percentage01, percentage02...]) |
对x和权重的乘积进行正序排列,返回大约处于percentage01、percentage02位置的x。最终的结果是近似结果,不保证稳定性和一致性。 |
√ |
× |
|
|
approx_percentile(x, weight, percentage, accuracy) |
对x和权重的乘积进行正序排列,返回大约处于percentage位置的x。支持设置返回结果的准确度。最终的结果是近似结果,不保证稳定性和一致性。 |
√ |
× |
|
|
numeric_histogram(bucket, x) |
按照bucket数量(直方图列数),统计x的近似直方图,返回结果为JSON类型。 |
√ |
× |
|
|
numeric_histogram(bucket, x, weight) |
按照bucket数量(直方图列数),统计x的近似直方图,返回结果为JSON类型。支持对x设置权重。 |
√ |
× |
|
|
numeric_histogram_u(bucket, x) |
按照bucket数量(直方图列数),统计x的近似直方图,返回结果为多行多列格式。 |
√ |
× |
|
|
approx_most_frequent(k, x) |
估算x列最常出现的 |
√ |
× |
approx_distinct函数
approx_distinct函数用于估算x中不重复值的个数。
语法
-
估算x中不重复值的个数,默认存在2.3%的标准误差。
approx_distinct(x) -
估算x中不重复值的个数,支持自定义标准误差。
approx_distinct(x, e)
参数说明
|
参数 |
说明 |
|
x |
参数值为任意数据类型。 |
|
e |
自定义标准误差,取值为[0.0115, 0.26]。 |
返回值类型
bigint类型。
示例
-
示例1:使用count函数计算PV,使用approx_distinct函数估算不重复的client_ip字段值作为UV,标准误差为2.3%。
-
查询和分析语句
* |SELECT count(*) AS PV, approx_distinct(client_ip) AS UV -
查询和分析结果返回 PV 为 941787,UV 为 723040。
-
-
示例2:使用count函数计算PV,使用approx_distinct函数估算不重复的client_ip字段值作为UV,自定义标准误差为10%。
-
查询和分析语句
* |SELECT count(*) AS PV, approx_distinct(client_ip,0.1) AS UV -
查询和分析结果返回 PV 为 9095,UV 为 7946。
-
approx_percentile函数
approx_percentile函数用于对x进行正序排列,返回大约处于percentage位置的数值。最终的结果是近似结果,不保证稳定性和一致性。
语法
-
对x进行正序排列,返回处于percentage位置的x,返回结果为double类型。
approx_percentile(x, percentage) -
对x进行正序排列,返回处于percentage01、percentage02位置的x,返回结果为array(double,double)类型。
approx_percentile(x, array[percentage01, percentage02...]) -
对x和权重的乘积进行正序排列,返回大约处于percentage位置的x,返回结果为double类型。
approx_percentile(x, weight, percentage) -
对x和权重的乘积进行正序排列,返回处于percentage01、percentage02位置的x,返回结果为array(double,double)类型。
approx_percentile(x, weight, array[percentage01, percentage02...]) -
对x和权重的乘积进行正序排列,返回大约处于percentage位置的x,返回结果为double类型。支持设置返回结果的准确度。
approx_percentile(x, weight, percentage, accuracy)
参数说明
|
参数 |
说明 |
|
x |
参数值为double类型。 |
|
percentage |
百分比值,取值范围为[0,1]。 |
|
accuracy |
准确度,取值范围为(0,1)。 |
|
weight |
权重,大于1的整数。 设置权重后,系统根据x与权重的乘积进行排序。 |
返回值类型
double类型或array(double,double)类型。
示例
-
示例1:对request_time列进行排序后,返回大约处于50%位置的request_time字段的值。
-
查询和分析语句
*| SELECT approx_percentile(request_time,0.5) -
查询和分析结果返回单列 _col0,值为
45.0,表示request_time的中位数(第 50 百分位)为 45.0。
-
-
示例2:对request_time列进行排序后,返回处于10%、20%及70%位置的request_time字段的值。
-
查询和分析语句
*| SELECT approx_percentile(request_time,array[0.1,0.2,0.7]) -
查询和分析结果为
[17.0,24.0,59.0],即request_time在第 10、20、70 百分位的近似值分别为 17.0、24.0、59.0。
-
-
示例3:根据request_time与权重的乘积对request_time列进行排序后,返回大约处于50%位置的request_time字段的值。其中,request_time<20时权重为100,否则权重为10。
-
查询和分析语句
* | SELECT approx_percentile( request_time,case when request_time < 20 then 100 else 10 end, 0.5 ) -
查询和分析结果为单列
_col0,返回值为18.0。
-
-
示例4:根据request_time与权重的乘积对request_time列进行排序后,返回大约处于80%和90%位置的request_time字段的值。其中,request_time<20时权重为100,否则权重为10。
-
查询和分析语句
* | SELECT approx_percentile( request_time,case when request_time < 20 then 100 else 10 end, array [0.8,0.9] ) -
查询和分析结果返回单列
_col0,值为[48.0,64.0]。
-
-
示例5:根据request_time与权重的乘积对request_time列进行排序后,返回大约处于50%位置的request_time字段的值,准确度为0.2。其中,request_time<20时权重为100,否则权重为10。
-
查询和分析语句
* | SELECT approx_percentile( request_time,case when request_time < 20 then 100 else 10 end, 0.5, 0.2 )
-
numeric_histogram函数
numeric_histogram函数按照bucket数量(直方图列数),统计x的近似直方图。返回结果为JSON类型。
语法
-
按照bucket数量(直方图列数),统计x的近似直方图。
numeric_histogram(bucket, x) -
按照bucket数量(直方图列数),统计x的近似直方图。支持为x设置权重。
numeric_histogram(bucket, x, weight)
参数说明
|
参数 |
说明 |
|
bucket |
直方图中列的个数,bigint类型。 |
|
x |
参数值为double类型。 |
|
weight |
权重,大于0的整数。 设置权重后,系统根据x与权重的乘积进行分组。 |
返回值类型
JSON类型。
示例
-
示例1:统计POST方法对应的请求时长的近似直方图。
-
查询和分析语句
request_method:POST | SELECT numeric_histogram(10,request_time) -
查询和分析结果:查询结果返回一个 JSON 对象,其中键为直方图各分桶的边界值(如
"45.03638445951907"、"31.617058096415327"、"51.0979254315973"),值为对应桶内的记录数(如 11351.0、16180.0、13786.0)。
-
-
示例2:根据request_time与权重的乘积对请求时长进行分组,从而统计POST方法对应的请求时长的近似直方图。
-
查询和分析语句
request_method:POST| SELECT numeric_histogram(10, request_time,case when request_time<20 then 100 else 10 end) -
查询和分析结果为一列
_col0,返回值为 JSON 格式的键值对,包含 10 组数值区间与对应频次的映射,例如"60.63632633267428":268070.0、"76.41340599455032":275250.0、"15.028066666666671":1500000.0等。
-
numeric_histogram_u函数
numeric_histogram_u函数按照bucket数量(直方图列数),统计x的近似直方图。返回结果为多行多列格式。
语法
numeric_histogram_u(bucket, x)
参数说明
|
参数 |
说明 |
|
bucket |
直方图中列的个数,bigint类型。 |
|
x |
参数值为double类型。 |
返回值类型
double类型。
示例
统计POST方法对应的请求时长的近似直方图。
-
查询和分析语句
request_method:POST | select numeric_histogram_u(10,request_time) -
查询和分析结果:查询结果返回
bucket_avg和count两列,共 10 行数据,分别表示各分桶的平均值与对应计数。例如第一个分桶 bucket_avg 为 14.20,count 为 18806.0;最后一个分桶 bucket_avg 为 70.78,count 为 13442.0。
approx_most_frequent函数
估算x列最常出现的k个值以及每个值出现的近似次数
语法
approx_most_frequent(k, x)
参数说明
|
参数 |
说明 |
|
k |
出现次数最多的k个值,5表示最多返回top5个值对应的近似次数 |
|
x |
参数值为varchar类型。 |
返回值类型
map(varchar, bigint)类型
示例
获取content字段,出现频率最高的3个值
-
字段样例
content: 'A' 'B' 'A' 'C' 'A' 'B' 'C' 'D' 'E' -
查询和分析语句
select approx_most_frequent(3, content) -
输出数据
查询返回一行数据,列名为
_col0,值为{"A":3,"B":2,"C":2}。