以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦!
第 4 章 FLUX语法
4.1 认识FLUX语言
1、Flux是一种函数式的数据脚本语言,它旨在将查询、处理、分析和操作数据统一为一种语法。想要从概念上理解 FLUX,你可以想想水处理的过程。我们从源头把水抽取出来,然后按照我们的用水需求,在管道上进行一系列的处理修改(去除沉积物,净化)等,最终以消耗品的方式输送到我们的目的地(饮水机、灌溉等)。
注意:InfluxData公司对FLUX语言构想并不是仅仅让它作为InfluxDB的特定查询语言,而是希望它像SQL一样,成为一种标准。按照这个计划,FLUX语言应该具备处理来自不同数据源的数据的能力。
4.2 最简示例
1、与处理水一样,使用FLUX语言进行查询时会执行以下操作。
- 从数据源中查询指定数量的数据
- 根据时间或字段筛选数据
- 将数据进行处理或者聚合以得到预期结果
- 返回最终的结果
2、下面 3 个示例的处理逻辑都是一样的,只不过数据源有所不同, 这 3 个示例只是让大家看一下语法,不需要运行。
- 示例 1 :从InfluxDB查询数据并聚合
from(bucket: "example-bucket")
|> range(start: -1d)
|> filter(fn: (r) => r._measurement == "exa|> mean() mple-measurement")
|> yield(name: "_results")
- 示例 2 :从CSV文件查询数据并聚合
import "csv"
csv.from(file: "path/to/example/data.csv")
|> range(start: -1d)
|> filter(fn: (r) => r._measurement == "example-measurement")
|> mean()
|> yield(name: "_results")
- 示例 3 :从PostgreSQL数据库查询数据并聚合
import "sql"
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://user:password@localhost",
query: "SELECT * FROM TestTable",)
|> filter(fn: (r) => r.UserID == "123ABC456DEF")
|> mean(column: "purchase_total")|> yield(name: "_results")
上面 3 个示例用的函数都是一模一样的,下面来讲解示例中出现的代码:
函数 | 说明 |
---|---|
from( )函数 | 可以指定数据源。 |
|> 管道转发符 | 将一个函数的输出转发给下一个函数。 |
range( ),fliter( ) | 两个函数在根据列的值对数据进行过滤 |
mean( )函数 | 在计算所剩数据的平均值。 |
yield( ) | 将最终的计算结果返回给用户。 |
4.3 铭记FLUX是一门查询语言
1、虽然,FLUX语言的自我定位一个脚本语言,但是我们必须注意它也是一个查询语言的事实。因此,一个FLUX脚本想要成功执行,它就必须返回一个表流。就像是SQL语言想要正确执行,它就必须返回一张表。
2、表流是FLUX里提出一种数据结构,在后面的文章里我们会表流的概念进行深度的讲解。另外需要注意,我们后面的代码,如果只返回一个单值,比如单个整数或者字符串这种,那就必须把这个值转换成表流才能运行。这个时候必须使用array.from函数。
示例如下: array.from函数的作用就是把x这个单值,包装在了一个表流里面返回了。
from "array
x = 1
array.from(rows: [{"value":x}])
4.4 注意InfluxDB支持的FLUX语言版本
1、需要注意,因为InfluxDB是一个用Go语言编写的数据库,它的整个项目成果就是一个单独的可执行二进制文件,所以FLUX语言其实也会被编译到同一个文件里。这意味着InfluxDB和FLUX会有版本绑定的关系。
2、这里,我放了一个链接https://docs.influxdata.com/flux/v0.x/influxdb-versions/ ,它是官方FLUX文档的一部分,这里明确记录了InfluxDB版本的FLUX语言版本的对应关系。
4.5 FLUX的基本语法
4.5.1 注释
1、在FLUX脚本中,没有多行注释一说,用户只能写单行注释。如果一行以两个斜杠开头,那么这一行中的所有内容会被视为注释。 示例:
// 这是一行注释
4.5.2 变量与复制
1、使用赋值运算符(=)将表达式的结果赋值变量,最终你可以使用变量名来返回变量 的值。示例:
s = "foo" // string
i = 1 // integer
f = 2.0 // float (floating point number)
s // Returns foo
i // Returns 1
f // Returns 2.0
4.5.3 基本表达式
1、FLUX支持基本的表达式,比如:
- + 数字相加或字符串拼接
- - 数字减法
- * 数字相乘
- / 数字除法
- % 取模
示例:
1 + 1// Returns 2 (^)
10 * 3
// Returns 30
(12.0 + 18.0) / (2.0 ^ 2.0) + (240.0 % 55.0)
// Returns 27.5
"John " + "Doe " + "is here!"
// Returns John Doe is here!
4.5.4 谓词表达式
4.5.4.1 比较运算符
1、谓词表达式使用比较运算符和逻辑运算符来实现,谓词表达式的最后的返回结果只能为true 或 false示例:
"John" == "John"
// Returns true
(^) 41 < 30
// Returns false
"John" == "John" and 41 < 30
// Returns false
"John" == "John" or 41 < 30
// Returns true
2、另外
- =~可以判断一个字符串时候能被正则表达式匹配上。
- !~ 是 =~ 的反操作,判断一个字符串是不是不能被某个正则表达式匹配。
例如:
"abcdefg" =~ "abc|bcd"
// Returns true
"abcdefg" !~ "abc|bcd"
// Returns false
4.5.4.2 逻辑运算符
1、在FLUX语言中,表示与逻辑需要使用关键字and,表示或逻辑需要使用关键字or。示例:
a = true
b = x = a and bfalse (^)
// Returns false
y = a or b
// Returns true
2、最后,not可以用来进行逻辑取反。示例:
a = trueb = not a (^)
// Returns false
4.5.5 控制语句
1、所谓控制语句是指一个编程语言中用来空值代码执行顺序的语法。 比如:
- if else
- for while 循环
- try catch 异常捕获
2、不过,在InfluxDB中,这些语法统统没有。唯一一个和if else比较像的是FLUX语言中的条件子句,它和python中的条件子句功能一样且语法相似,和java语言相比的话它有些像三元表达式。示例如下:
x = 0
y = if x == 0 then "hello" else "world"
3、此处,if then else被我们成为条件子句,你需要先指定一个条件,然后当条件为true的时候,条件子句会返回then后面的内容,也就是"hello"。如果是 flase,那么就会返回else后面的内容,也就是"world"。