写点什么

Influxdb 中 Select 查询请求结果涉及到的一些数据结构

  • 2019-11-20
  • 本文字数:1674 字

    阅读完需:约 5 分钟

Influxdb中Select查询请求结果涉及到的一些数据结构

本文将给大家介绍的是在 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 编码到


[]byte: agkey1\0tagkey2\0...\tagvalue1\0tagvalue2\0...
复制代码


具体实现定义在 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 中,如果没有查询到值,则使用相应的添充规则生成相应的值


具体可参见:


group-by-time-intervals-and-fill
复制代码


定义:


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


2019-11-20 10:101576

评论

发布
暂无评论
发现更多内容

Qt|字符排序以及转化问题

中国好公民st

qt 7月月更

不习惯的Vue3起步四 の 生命周期&provide/inject

空城机

Vue3 7月月更

Pro 单店版和多店版,你还傻傻分不清楚?

CRMEB

《深入 Linux 设备驱动程序那和机制》读书笔记

贾献华

7月月更

适合初学者的 10 个JavaScript 代码整洁技巧

devpoint

JavaScript ES6 7月月更 数据操作

QT实现 文件夹复制

小肉球

qt 7月月更

《看完就懂系列》聊聊CSS3的 calc() 函数

南极一块修炼千年的大冰块

7月月更

TDesign 组件库技术方案指北

TDesign

开源 Vue React 组件库

面对裁员?焦虑?不如好好投资自己

沃德

程序员 7月月更

图解网络:访问控制列表ACL,功能堪比防火墙!

wljslmz

防火墙 acl 网络技术 7月月更 访问控制列表

深入JS函数中默认参数的使用

猪痞恶霸

前端 js 7月月更

GaussDB云数据库初步使用记录

DS小龙哥

7月月更

RocketMQ之消费者启动与消费流程

vivo互联网技术

RocketMQ 中间件 ACK

SLSA 框架与软件供应链安全防护

SEAL安全

SLSA 软件供应链安全

你想知道的数组易错知识都在这了-C

芒果酱

7月月更

Qt | 串口通信 QSerialPort

YOLO.

通信 qt 串口 串口通信 7月月更

【LeetCode】奇数值单元格的数目Java题解

Albert

LeetCode 7月月更

自己搭建git服务器:linux自己Gitlab服务

zhoulujun

gitlab git私有参考 git部署 git服务端

纯CSS实现四种方式文本反差色效果

南城FE

CSS 前端 css动画 7月月更 反差色

Node.js异步编程之Promise

是乃德也是Ned

node.js 前端 7月月更

Linux 0.12 源码阅读

贾献华

7月月更

Wireshark抓包分析Eureka注册发现协议

程序员欣宸

Java SpringCloud Eureka 7月月更

5G NR RRC连接控制

柒号华仔

5G 7月月更

Java面向对象基础

五分钟学大数据

Java 7月月更

多传感器时间同步

秃头小苏

时间同步 7月月更

注意!软件供应链安全挑战持续升级

SEAL安全

安全 软件供应链

QT和MFC的优缺点比较

乌龟哥哥

7月月更

iOS 中的 Category

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

老司机狂飙之路--EventBus原理简要分析

芝麻粒儿

android EventBus 7月月更

在线直播系统源码——开源源码

开源直播系统源码

软件开发 直播源码 开源源码 在线直播系统源码

项目git commit时卡主不良代码:husky让Git检查代码规范化工作

zhoulujun

git husky lint-stated

Influxdb中Select查询请求结果涉及到的一些数据结构_文化 & 方法_刘伟_InfoQ精选文章