(七)FLUX查询InfluxDB

news/2024/2/28 16:36:04

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦!

第 7 章 FLUX查询InfluxDB

7.1 前言

1、本节内容较为重要

7.2 FLUX查询InfluxDB的语法

1、使用FLUX语言查询InfluxDB,必须以from -> range打头。range必须紧跟在from后面,不这么写的话会直接报错。

2、例如:

from(bucket: "test_init")
|> range(start: - 1 h)

7.3 表、表流以及序列

1、我们知道InfluxDB是使用序列的方式去管理数据的。而FLUX语言又企图兼容一些关系型数据库的查询,而关系型数据库里的数据结构就是一个有行有列的 table。因此对于FLUX语言来说,就需要将序列和表统一成一个东西。所以FLUX引入了表流的概念。简单来说,FLUX可以一次性查出多个序列,这个时候一个序列对应一张表,而表流其实就是多张表的集合。同时表流和表的关系其实是全表和子表的关系,子表是全表按照_field,tag_set和_measurement进行group by之后的结果。在这种情况下,如果调用聚合函数,其实只会在子表中进行聚合。

在这里插入图片描述
2、最后,如果一张表对应的是一个序列了,那么一张表里的一行其实就对应着序列中的一个数据点了。

7.4 filter维度过滤

1、使用filert函数可以对数据按照_measurement、标签集和字段级进行过滤,后面的课程会给大家讲解filter的性能问题。

7.5 类型转换函数与下划线字段

1、Flux语言中有很多不用指定字段名称的管道函数,比如toInt()。其实toInt()这个函数默认要求你的字段中必须要有_value字段,没有_value字段的话也会直接报错。

2、其实在我们查询出来的数据中,以下划线开头的字段其实代表了一种约定,就是FLUX中有很多函数想要正常运行时要依赖于这些下划线打头的字段的。所以原则上来说,程序员应该遵守这些约定,不要擅自更改下划线开头的字段。

7.6 map函数

1、map函数的作用是遍历表流中的每一条数据。

2、示例:

import "array"
a rray.from(rows: [{"name":"tony"},{"name":"jack"}]) |> map(fn: (r)=> {return if r["name"] == "tony" then {"_name": "tony不是jack"} else {"_name":"jack不是tony"}
})

3、这里需要注意,map函数需要我们传递一个参数 fn,它要求传递一个单个参数输入,且输出必须是record的函数,其中输入数据的类型会是record。

7.7 自定义管道函数

1、此处,我们定义一个管道函数,它可以将表流中的_value字段的值乘上x倍。大家在接下来的示例中注意声明管道函数时所用的语法。

big100 = (table=<-,x) => {
return table |> map(fn: (r) => ({ (^) r with "_value":r["_value"]*x}))}接下来我们调用刚才声明的函数,最终整个脚本如下:big 100 = (table=<return table - ,x) => {|> map(fn: (r) => ({r with "_value":r["_value"]*x}))
}
from(bucket: "test_init")
|> range(start: -1h)
|> filter(fn: (r) => r["_measurement"] == "go_goroutines")
|> big100(x:100.00)

2、可以自行运行查看函数效果。这里需要强调的是,管道函数的第一个参数必须写成table=<-,它表示通过管道符输入进来的表流数据,需要注意,table并不一定写成table但是=<-的格式绝对不能变。

7.8 在文档中区分管道函数和普通函数

1、再次来到函数文档。

在这里插入图片描述

2、当我们看到一个函数文档,它会有一个区域叫做Function type Signature(函数签名),它表示着函数接收哪些参数以及会返回什么。最前面的小括号里的内容就是参数列表,如果参数列表的第一个参数是<-tables: stream[A],那就表示它是一个可以接收表流输入的管道函数。反之,如果没有<-tables: stream[A],那么它就是一个普通函数。

7.9 window和aggregateWindow函数

1、window函数和aggregateWindow函数其实代表着InfluxDB中的两种开窗方式,两者不同的地方在于,window函数会将整个表流重新分组。window开窗后,是按照序列+窗口的方式对整个表流进行分组。但是 aggregateWindow函数会保留原来的分组方式,这样一来,使用aggregateWindow函数进行开窗后的表流,仍然是按照序列的方式来分组的。

7.10 yield和join

1、当flux脚本中出现未被赋值给某个变量的表流时,InfluxDB执行FLUX脚本时会自动帮他们在管道的最后面加上|> yield(name: “_result”)函数,yield函数其实是指定了我们当前这个表流是整个 FLUX脚本最后返回的结果,而且这个结果的名字叫"_result"。当FLUX脚本中出现多个为赋值给变量的表流时,给多个表流自动补上|>yield(name:“_result”)就会出问题了,这是因为当有多个表流后面都有|>yield时,其实相当于一个FLUX脚本会返回多个结果。但是此处要求名称是不能重复的,所以当有多个未赋值的表流时,就必须显示指定yield(name:“xxx”),而且名称千万不可重复。

2、但是,在一个FLUX脚本里同时返回多个结果集并不是推荐的操作,这通常会让程序的逻辑变的很奇怪,我们之所以能在一个FLUX脚本里面写多次from函数,其实是为了方便我们进行join的。

3、再但是,我并不建议在FLUX脚本中使用join操作,这必须要谈到FLUX脚本的常见使用场景,就是每隔一段时间进行一次查询。如果这个时候,我用一个from从InfluxDB中查询数据,其中有code=01等机器编号信息。然后我再用一个from去查询mysql,得到一张机器的属性表。接下来对两张表进行 join,这在逻辑上很合理,但最大的问题就是FLUX脚本无法实现数据的缓存。如果我这个FLUX脚本是每 15 秒执行一次,那就会导致我们需要每 15 秒要去mysql上全表扫描一遍机器信息表,效率十分低下。

4、个人建议仅使用FLUX进行简单的查询,然后在应用层的程序里进行join操作。因此,本系列文章并不讲解FLUX语言的join操作。


http://www.ppmy.cn/news/977020.html

相关文章

【机器学习】模型常用评估指标

L0 范数、L1 范数、L2 范数、余弦距离 向量的范数可以简单形象理解为向量的长度&#xff0c;或者向量到零点的距离&#xff0c;亦或是相应两个点之间的距离。因此范数通常会对应一个距离概念。 L0 范数 L0 范数表示向量中非零元素的个数&#xff1a; ∣ ∣ x ∣ ∣ 0 # ( i…

ASIC芯片的龙头fabless公司比特大陆究竟是做什么的?

我们目前在招聘的职位有&#xff1a; #高级模拟电路设计工程师 #高级全定制电路工程师 #数据库性能优化工程师 #ic前端工程师 #STA工程师 #物理设计工程师 #模拟版图设计工程师 #Library Characterization Engineer #SRAM Chip Design Engineer #DFT工程师 #Senior CAD Engine…

一图读懂数电票丨发票新时代的机遇与挑战

随着国家“金税4期”的推进,“全电票”近期被正式更名为“数电票”。它的出现为企业的发票管理带来了哪些机遇与挑战?下图为你简单梳理: 数电票的应用,将有助于彻底解决现有业务流程中的发票管理环节存在的集中化和自动化难题。它将推动对发票的管理与企业的业务流程、法务工…

【DataX】实现数据从postgresql迁移至tdenginue

DataX postgresql迁移至tdenginue 环境准备下载DataX解压DataX 编写DataX JOB名词解释及修改点 执行脚本 环境准备 执行DataX需要java 1.8&#xff0c;以及python环境&#xff0c;python支持2.0和3.0&#xff0c;我这里使用的是python3.6 下载DataX 下载地址 解压DataX ta…

ChatGPT分销版多开v4.6.1

新增 虎皮椒支付网关自定义 优化 虎皮椒支付 支持在非微信环境下唤醒微信APP并完成支付 修复 小程序端sd绘画报错

ChatGPT分销版多开v2.7.0

修复上次更新导致的一个小问题

ChatGPT分销版多开v4.4.1

修复由于加密导致某些站点出现服务器错误

ChatGPT分销版如何接入文心一言(文心千帆)?

对于ChatGPT分销版的对话通道接入还是比较简单的&#xff0c;为什么这么久才接入&#xff1f; 其实很久之前我们就在申请接入百度的文心一言&#xff08;文心千帆&#xff09;&#xff0c;但是最之前的条件确实太苛刻了&#xff0c;需要签订各种协议以及缴纳各种费用&#xff0…

react当我们有两个完全不相关的组件想要通信时,就可以利用这种模式,其中一个组件负责订阅某个消息,而另一个元素则负责发送这个消息。使用Context配合

在nextjs项目中&#xff0c;发现两个组件没啥关系&#xff0c;例如一个是一直存在的头部组件&#xff0c;另一个是页面中的组件&#xff0c;当我点击头部组件中的特定按钮时&#xff0c;把数据传递到页面组件中&#xff0c;页面组件接受到canshu数据后在做其他操作&#xff0c;…

redis工具类(缓存的设置,缓存击穿,穿透)

#maven依赖<!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>import cn.hutool.core.date.DateTime; import cn.hutool.core.util.Bo…

JavaScript 容易遗漏的方法

数据类型&#xff1a; 在 JavaScript 中有 5 种不同的可以包含值的数据类型&#xff1a; stringnumberbooleanobjectfunction 有 6 种类型的对象&#xff1a; ObjectDateArrayStringNumberBoolean 以及 2 种不能包含值的数据类型&#xff1a; nullundefined 进制转换 va…

微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口

我开发 的小程序类目符合wx.getLocation接口的申请标准 但是却还是显示无权限申请 后来研究好久才发现&#xff0c;小程序需要在发布线上版本时提交用户隐私保护指引 如未设置也可以在 设置-服务内容声明-用户隐私保护指引-声明处理用户信息项并补充填写后提交用户隐私协议审核…

Java实现获取客户端真实IP方法小结

Java实现获取客户端真实IP方法小结 在jsP里&#xff0c;获取客户端的IP地址的方法是&#xff1a;request.getRemoteAddr()&#xff0c;这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件&am…

【仿写spring】一、通过反射读取带有@RequestMapping与@Controller注解的类并模拟请求路径调用方法

目录 简介思路实践一、自定义注解RequestMapping&#xff0c;Controller二、路径转全限定名方法三、扫描文件夹四、通过反射来寻找有RequestMapping以及Controller的类五、获取对象实例六、通过invoke调用方法 文件结构以及测试结果1、文件结构2、TestController3、测试结果 简…

提示词(prompt)工程指南(五):ChatGPT 提示工程

在本节中&#xff0c;我们介绍ChatGPT的最新提示工程技术&#xff0c;包括提示、应用、限制、论文和其他阅读资料。 完整的中文版本指南和更丰富的参考资料在 Github 和 Gitee 中&#xff0c;自动持续翻译更新&#xff1a; &#x1f419; 关于提示词工程&#xff08;prompt&…

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

Hive 调优集锦(1)

一、前言 1.1 概念 Hive 依赖于 HDFS 存储数据&#xff0c;Hive 将 HQL 转换成 MapReduce 执行&#xff0c;所以说 Hive 是基于Hadoop 的一个数据仓库工具&#xff0c;实质就是一款基于 HDFS 的 MapReduce 计算框架&#xff0c;对存储在HDFS 中的数据进行分析和管理。 1.2 架…
最新文章