本文将给大家介绍的是在 Influxdb 中 Select 查询请求结果中涉及到的一些数据结构,对于 Influxsql 的查询语句不太熟悉的同学,可以在先了解了解:https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration
数据结构
1 Series
Series 其实就是 measurement 和 tags 的组合,tags 是 tag key 和 tag value 的 map.这个 Tags 的 id 是如何产生的呢,其实就是对 tag key 和 tag value 编码到
具体实现定义在 query/point.go 中的 encodeTags。
2 Row
Row 表示查询结果集中的每一行, 其中的 Values 表示是返回的 Fields 的集合
3 bufFloatIterator
bufFloatIterator 相当于 c 里面的链表元素,itr 指向下一个元素的指针,buf 表示当前元素,即 FloatPoint 类型的链表的迭代器。
FloatPoint
FloatPoint 定义在 query/point.gen.go 中, 表示一条 field 为 float 类型的数据
Next 实现
当前 Iterator 的值不为空,就返回当前的 buf, 当前的值为空,就返回 itr.itr.Next(),即指向的下一个元素
unread: iterator 回退操作
4 floatMergeIterator
floatMergeIterator 组合了多个 floatIterator
因为要作 merge, 这里需要对其管理的所有 Interator 元素作排序,这里用到了 golang 的 container/heap 作堆排。
因为要用 golang 的 container/heap 来管理,需要实现下面规定的接口,
floatMergeIterator 定义中的 floatMergeHeap 即实现了上面的接口,我们主要来看一下比较函数的实现,比较的其实就是 FloatPoint。
比较的优先级先是 FloatPoint 的 measurement 名,然后是 tagset id, 最后是 time,将这个比较函数我们就可以知道.
结构
Next 函数的实现
一张长图
结合上面的 Less 函数可知,针对所有的 FloatPoint, 排序的最小单位是 Window(由 measurement name, tagset id, time window 组成),属性同一 Window 的 FloatPoint 不再排序。如果是按升级规则遍历,则遍历的结果是按 Window 从小到大排,但同一 Window 内部的多条 Point,时间不一定是从小到大的。
5 floatSortedMergeIterator
同样它也借助了 golang/container 中的 heap, 与 floatMergeIterator 相比它实现了全体 Point 的排序遍历,我们来看一下是如何实现的;
pop 函数:
对所有 Iterator 包含的所在 FloatPoint,都从排序,没有 Window 的概念.
6 floatIteratorScanner
floatIteratorScanner 将 floatIterator 的值扫描到 map 里。
ScanAt
在 floatIterator 中找满足条件的 Point, 条件是 ts, name, tags 均相等,实现比较简单
7 floatParallelIterator
在一个单独的 goroutine 里面循环调用 floatIterator.Next 获取 FloatPoint,然后写入到 chan 中:
使用的时候,调用 Next, 从上面的 Chan 中读数据:
8 floatLimitIterator
限制在每个 window 中读取的 Point 个数
next
9 floatFillIterator
运行在 select 中的 Group by time fill(…), 在当前的 interval 的 window 中,如果没有查询到值,则使用相应的添充规则生成相应的值
具体可参见:
定义:
10 floatInterruptIterator
每遍历 N 条数据后,检测下遍历是否需要中断
定义:
Next
11 floatReduceFloatIterator
对每个 interval 内的数据作 reduce 操作
定义:
reduce()
返回处理后的 points, 函数较长,但逻辑比较简单
12 CallIterator
CallIterator 实现了聚合函数的 Iterator: count, min, max, sum, first, last, mean, distinct,Median…主要是使用我们上面介绍的一系列的 ReduceIterator,提供相应的 Reducer, 实现 AggregateFloat 和 Emit 这两个函数
13 IteratorOptions
构建 Iterator 时用到的一些配置选项, 包含的内容较多
定义:
14 Cursor
select 后会得到这个 cursor,用来遍历查询结果
定义:
Scan
15 floatIteratorMapper
*IteratorMapper 系列, 主要作用是遍历 cursor
定义
我们来看一下 Next 接口, 对当前的 cursor 作 scan 来返回 FloatPoint
总结
以上就是 Influxdb 的 select 查询请求结果涉及到的一些数据结构
本文转载自公众号 360 云计算(ID:hulktalk)。
原文链接:
https://mp.weixin.qq.com/s/MctXrEO_mrb9ABu3Z7bO1Q
评论