摘要:本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法。

本文分享自华为云社区《​​华为云GaussDB(for Influx)揭秘第九期:最佳实践之数据直方图​​》,作者: GaussDB 数据库 。

背景

随着5G和IOT的快速发展,面对爆发式增长的时序数据,如何才能挖掘数据中的潜在价值,为客户的业务运行、商业决策提供精确的指导?在统计学中,直方图作为一种经典的分析工具,可以直观地描述数据分布特征,应用场景极其广泛,例如:

  • 在网络监控数据方面,通过直方图可以捕捉异常数据的分布区间,便于网络的自诊断与修复;
  • 在时序数据分析方面,通过直方图可以表示数据的分布特征,便于时序数据的特征提取;
  • 作为代价评估模型的输入从而指导数据库内部的查询优化;

本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法。

直方图的实现方式

时序及分析性数据库大部分都支持了直方图算子,但各个数据库中的直方图实现上也有一定差异,其中几种比较典型的直方图实现有:

Druid:Druid-histogram拓展中提供了近似直方图(approximate histogram aggregator)和固定桶直方图(fixed buckets histogram)聚合器。其中近似直方图根据论文《A Streaming Parallel Decision Tree Algorithm》实现,较适用于随机分布的数据。

ClickHouse:ClickHouse提供了自适应直方图,查询的结果为近似值。与Druid类似,其实现参考了论文《A Streaming Parallel Decision Tree Algorithm》。当新数据输入到直方图时,直方图中桶的边界会被调整,通常情况下,桶的宽度并不相等。

ElasticSearch:ElasticSearch中支持了HDR Histogram(High Dynamic Range Histogram),HDR Histogram是一种替代实现,在计算网络延迟的百分位数表现良好。同时,当值的范围并不清楚时,官方并不建议使用HDR Histogram,因为此时内存占用会很高。

InfluxDB v2.0:InfluxDB同样提供了直方图的实现,与其它直方图略有不同。InfluxDB2.0可以设置直方图的桶的生成方式,linearBins()可以将数据按照线性分割,即桶宽相等,logarithmicBins()则可以将数据按照指数分割,即桶宽呈指数形式增长。

GaussDB(for Influx):GaussDB(for Influx)支持两种直方图类型查询,一种确定桶数的等高直方图,另一种确定桶边界的定界直方图。等高直方图指每个桶的高度接近的直方图,而定界直方图指设定桶的上下边界值的直方图。定界直方图支持用户的自定义,更方便用户根据业务特点提取数据的关键分布特征。支持四种数据类型,包括整数、浮点数、字符串与布尔类型,可满足各行各业的数据分析需求。

GaussDB(for Influx)直方图使用

本章节通过实际的数据样例介绍GaussDB(for Influx)直方图的使用。

3.1 数据样例

示例采用的数据如下:mst是表名,包含4个field(每个field对应一种数据类型)与2个tag,元数据如下:

> show field keys
name: mst
fieldKey fieldType
-------- ---------
address string
age integer
alive boolean
height float

> show tag keys
name: mst
tagKey
------
country
name

原始数据如下:

> select * from mst
name: mst
time address age alive country height name
---- ------- --- ----- ------- ------ ----
1629129600000000000 shenzhen 12 true china 70 azhu
1629129601000000000 shanghai 20 false american 80 alan
1629129602000000000 beijin 3 true germany 90 alang
1629129603000000000 guangzhou 30 false japan 121 ahui
1629129604000000000 chengdu 35 true canada 138 aqiu
1629129605000000000 wuhan 48 china 149 agang
1629129606000000000 52 true american 153 agan
1629129607000000000 anhui 28 false germany alin
1629129608000000000 xian true japan 179 ali
1629129609000000000 hangzhou 60 false canada 180
1629129610000000000 nanjin 102 true 191 ahuang
1629129611000000000 zhengzhou 123 false china 203 ayin

3.2 等高直方图

查询语法:

SELECT HISTOGRAM( [ * | <field_key> | /<regular_expression>/ ] , <N> ) [WINTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause]  [SLIMIT_clause] [SOFFSET_clause]

HISTOGRAM(field_key, N)计算指定指标field在各区间的统计值,其中N是要求的。

HISTOGRAM(/regular_expression/, N)计算满足正则匹配的field在各区间的统计值。

HISTOGRAM(*, N)计算整数与浮点数数据类型的field在各区间的统计值。

查询示例

1、查询field_key为age且桶数为5的等高直方图。

> select histogram(age, 5) from mst where time >= 1629129600000000000 and time <= 1629129611000000000
name: mst
time histogram value
---- --------- -----
0 20 3
0 30 2
0 48 2
0 60 2
0 9223372036854775807 2

2、查询field_key满足正则匹配为/hei/(符合要求的只有height)且桶数为5的等高直方图。

# 浮点数类型
> select histogram(/hei/, 5) from mst where time >= 1629129600000000000 and time <= 1629129611000000000
name: mst
time histogram_height value
---- ---------------- -----
0 90 3
0 138 2
0 153 2
0 180 2
0 1.7976931348623157e+308 2

3、支持field为字符串类型的address与布尔类型的alive的等高直方图查询。

> select histogram(address, 5) from mst where time >= 1629129600000000000 and time <= 1629129611000000000
name: mst
time histogram value
---- --------- -----
1629129600000000000 chengdu 3
1629129600000000000 hangzhou 2
1629129600000000000 shanghai 2
1629129600000000000 wuhan 2
1629129600000000000 zhengzhou 2

> select histogram(alive, 3) from mst where time >= 1629129600000000000 and time <= 1629129611000000000
name: mst
time histogram value
---- --------- -----
1629129600000000000 false 5
1629129600000000000 true 6

下图分别表示上述查询的各等高直方图

揭秘华为云GaussDB(for Influx):数据直方图_浮点数

3.3 定界直方图

查询语法:

SELECT HISTOGRAM( [ * | <field_key> | /<regular_expression>/ ] , ‘specifyBins’,  boundary1, boundary2,...,boundaryN) [WINTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause]  [SLIMIT_clause] [SOFFSET_clause]

HISTOGRAM(field_key, ‘specifyBins’, boundary1, boundary2,...,boundaryN)计算指定指标field在指定区间的统计值,specifyBins为定界直方图标志,boundaryN表示指定的各边界值,可以是整数、浮点数、字符串与布尔四种数据类型。

HISTOGRAM(/regular_expression/, ‘specifyBins’, boundary1, boundary2,...,boundaryN)计算满足正则匹配的field在指定区间的统计值。

HISTOGRAM(*, ‘specifyBins’, boundary1, boundary2,...,boundaryN)计算整数与浮点数数据类型的field指定区间的统计值。

查询示例:

1、查询field_key为age且指定区间[0, 10), [10, 20), [20, 30), [30, 40), [40, 50)的定界直方图。

# 整数类型
> select histogram(age, 'specifyBins', 10,20,30,40,50) from mst
name: mst
time histogram value
---- --------- -----
0 10 1
0 20 2
0 30 2
0 40 1
0 50 1

2、查询field_key满足正则匹配为/eight/(符合要求的只有height)且指定区间[0, 160), [160, 170), [170, 180), [180, 190), [190, 200)的定界直方图。

# 浮点数类型
> select histogram(/eight/, 'specifyBins', 160.0, 170.0, 180.0, 190.0, 200.0) from mst
name: mst
time histogram value
---- --------- -----
0 160 7
0 170 0
0 180 2
0 190 0
0 200 1

3、支持field为字符串类型的address与布尔类型的alive的定界直方图查询。

# 字符串类型
> select histogram(address, 'specifyBins', 'anhui', 'beijin', 'chengdu') from mst
name: mst
time histogram value
---- --------- -----
0 anhui 1
0 beijin 1
0 chengdu 1

# 布尔类型
> select histogram(alive, 'specifyBins', false, true) from mst
name: mst
time histogram value
---- --------- -----
0 false 5
0 true 6

下图分别表示上述查询的各定界直方图。

揭秘华为云GaussDB(for Influx):数据直方图_华为云_02

总结

直方图作为一种经典的统计分析工具,由于其构建简单高效且能有效地描述数据分布特征,因此它的应用场景极其广泛,特别是在分析型数据库中。GaussDB(for Influx)中不仅支持了两种类型的直方图查询能力(等高与定界直方图),而且支持了四种数据类型(整数、浮点数、字符串与布尔型),能够帮助用户快速构建业务的数据分析能力,助力用户商业成功。

另外,GaussDB(for Influx)还在集群化、冷热分级存储、查询、高可用方面也做了深度优化,能更好地满足时序应用的各种场景。

结束

本文作者:华为云数据库创新Lab & 华为云时空数据库团队 欢迎加入我们!

云数据库创新Lab(成都、北京)简历投递邮箱:xiangyu9@huawei.com

华为云时空数据库团队(西安、深圳)简历投递邮箱:yujiandong@huawei.com


点击关注,第一时间了解华为云新鲜技术~