Flux是InfluxDB2.x函数式数据脚本语言。flux可以查询、处理、分析数据,是专门为时间序列优化的强大语言。flux可以实现很多功能,包括窗口函数、移动平均,自定义函数,连接数据流,创建任务和报警。本文介绍如何创建flux自定义函数。
flux查询实现四个方面。获取数据并基于时间或其他列值进行过滤、处理并塑造数据,然后返回结果。你也能使用flux创建任务,设定计划进行执行,非常适合实现自动降采和分析。flux设计之初就考虑了这几个特征,让开发者很容易学习、很容易阅读,查询编码能够测试、发现并修复bug,当然最重要的是开源特性。
flux也基于可扩展的,开发者能够构建自己的函数和库。flux内置了很多函数,从简单的到复杂的地理空间计算。当开发者有特殊需求时,flux灵活性通过自定义函数可以提供极大的能力。
自定义函数是非常有用,通常可以封装重复的编码实现内置函数没有提供的功能。如非常复杂的计算,或简单的如数据单位转换。创建自定义函数可以节约时间,因为不再需要重复写计算过程,而且让代码更易读、调试更简单。下面通过简单计算平方函数作为示例进行说明。
函数语法如下:
[function name] = ([variable]) => [implementation]
举例:
squared = (x) => x*x
上面定义了一个函数,下面可以flux脚本中使用:
from(bucket: “foo”)
|> range(start: -1hr)
|> filter(fn: (r) => r._measurement == “samples”)
|> map(fn: (r) => ({ _value: squared(x: r._value)}))
|> filter(fn: (r) => r._value > 23.2)
上面示例中,map函数中使用了我们自定义函数计算所有值的平方。
本节介绍自定义前向管道函数,这些函数可以与其他操作直接连接在一起,而不是像squared()函数嵌套在其他函数内部。在自定义函数内部可以使用标准flux语法。
管道函数的语法如下:
[function name] = ([table]=<-,[variable]) => [table] |> [implementation]
下面自定义函数平方表中每个值,而不需要一个变量执行一次。代码如下:
allSquared = (tables=<-) => tables |> map(fn: (r) => squared(r._value))
调用allSquared函数代码如下:
from(bucket: “foo”)
|> range(start: -1hr)
|> filter(fn: (r) => r._measurement == “samples”)
|> allSquared()
|> filter(fn: (r) => r._value > 23.2)
这个示例中,没有指定函数体内使用的变量,所以在所有变量上执行。前向管道函数使得代码非常清晰,未来维护代码也会更好读、好理解。
本文介绍了如何自定义flux函数,主要内容参考官方博客。