InfluxDB入门记录(三)flux-dsl

通过flux-dsl构建flux查询语句的详细教程可参考 flux-dsl

一、函数属性赋值方式

flux中的每一个,以window函数为例,该函数具有两个属性:

java 复制代码
window(every: 1m, period: 10s)
//every   窗口创建频率
//period  窗口长度

1、使用内置构造方法

java 复制代码
Flux flux = Flux  
    .from("telegraf")  
    .window(15L, ChronoUnit.MINUTES, 20L, ChronoUnit.SECONDS)  
    .sum();

window构造方法为:window(every, everyUnit, period, periodUnit)

2、使用内置属性方法(推荐)

java 复制代码
Flux.from("telegraf")
    .window()
        .withEvery(15L, ChronoUnit.MINUTES)
        .withPeriod(20L, ChronoUnit.SECONDS)
    .sum();

3、使用通用 property 方法

java 复制代码
Flux.from("telegraf")
    .window()
        .withPropertyValue("every", 15L, ChronoUnit.MINUTES)
        .withPropertyValue("period", 20L, ChronoUnit.SECONDS)
    .sum();

这种方法较为灵活,但缺点是属性名称出错会导致无法查询。

二、Flux支持的函数

1、form

from是所有查询的起点,定义从哪个存储桶中获取数据。

ini 复制代码
Flux flux = Flux.from("telegraf");

但是只有from函数无法获得数据,需要与其他函数配合使用

2、range

range() 用来指定查询的时间边界,只返回指定时间范围内的数据。其中包含两个参数:

  • start 查询开始时间(必须)
  • stop 查询结束时间(可选,默认为当前时间)

使用方法如下:

java 复制代码
// by interval
Flux flux = Flux
    .from("test")
    .range(-12L, -1L, ChronoUnit.HOURS) //查询12小时前到1小时前的数据

使用instant

java 复制代码
// by Instant
Flux flux = Flux
    .from("test")
    .range(Instant.now().minus(4, ChronoUnit.HOURS),
           Instant.now().minus(15, ChronoUnit.MINUTES)
    );

3、filter

用于筛选记录的函数。该函数必须接受一个参数,即待筛选的记录,并返回一个布尔值。返回值为 true 的记录将被包含在结果中。该方法支持对_measurementtag_field等字段筛选:

less 复制代码
Flux flux = Flux
        .from("test")
        .filter(Restrictions.and(Restrictions.measurement().equal("mem"),
                Restrictions.tag("service").equal("app-server"),
                Restrictions.field().equal("usage_system")))
        .range(-4L, ChronoUnit.HOURS);

4、drop

删除操作会将指定的列从表中排除(只会在显示结果中删除某一列,实际数据不会改变):

java 复制代码
Flux flux = Flux
    .from("test")
    .drop(new String[]{"_start","_stop", "_measurement"});  // 删除_start列、_stop列和_measurement列

使用后效果如下:

  • 使用前:
  • 使用后:

5、keep

Keep 是 drop 的逆操作。它将返回一个仅包含指定列的表,忽略所有其他列。

java 复制代码
Flux flux = Flux
    .from("telegraf")
    .keep(new String[]{"_time", "_value"});  // 只保留_time和_value
  • 使用前:
  • 使用后:

6、limit

限制结果中返回的行数:

java 复制代码
Flux flux = Flux
    .from("telegraf")
    .limit(100, 10); //n, offset
  • n: 要输出的最大记录数。
  • offset: 要跳过的记录数。默认值为 0。

7、sort

按指定的列对结果进行排序:

arduino 复制代码
Flux flux = Flux
    .from("test")
    .sort(new String[]{"_value", "_time"}, true) // columns, desc
    //此处为根据_value列和_time列排序,降序排序
  • columns: 用于排序的列列表。优先级从左到右。默认值为空"value"
  • desc: 按降序排列结果。默认为 false(布尔值)

8、聚合函数

  • sum() 求和
  • mean() 平均
  • max() 最大
  • min() 最小
  • count() 计数
java 复制代码
Flux flux = Flux
    .from("test")
    .sum("_value");
  • column: 用于计算的列

9、window 和 aggregateWindow

aggregateWindow用于将聚合函数或选择器函数(任何带有列参数的函数)应用于固定的时间窗口:

csharp 复制代码
Flux flux = Flux
    .from("telegraf")
        .aggregateWindow()
            .withEvery("10s")
            .withAggregateFunction("sum")
            .withColumn("_value")

aggregateWindow查询和window查询的最大区别就是:

  • aggregateWindow不会分表, 每个时间窗口的结果汇总为一张表, 并且结果必须被聚合函数处理
  • window会将不同的时间窗口分为不同的表, 且只用于汇总, 该函数不会进行聚合处理

window使用方法如下:

sql 复制代码
Flux flux = Flux
    .from("telegraf")
    .window(15L, ChronoUnit.MINUTES,
            20L, ChronoUnit.SECONDS)
    .max();
  • every- 窗口之间的间隔时间。默认为period的值。
  • period- 窗口分区持续时间。
相关推荐
泡泡鱼(敲代码中)33 分钟前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
IT_陈寒44 分钟前
Java Stream处理大集合,我的内存怎么就炸了
前端·人工智能·后端
悟空码字1 小时前
四轮对话两张配图:用 WorkBuddy 优化公众号发文配图的实战指南
人工智能·后端·腾讯
ServBay1 小时前
xAI的 Grok Bot发布,AI 已经学会自己上班了
后端·ai编程·grok
分支预测失败1 小时前
RISC-V 多核缓存一致性机制解析:MESI 协议族、CMO 扩展与 Linux 同步原语
后端
n8n1 小时前
Spring AI 检索增强生成(RAG)实战:让模型掌握你的私有知识
后端
l1t1 小时前
DeepSeek总结的chdb-core v26.7.3发版说明
数据库·clickhouse·oracle
Nturmoils1 小时前
只备份一个 schema,别把整库都搬走
后端
妙码生花1 小时前
利用AI从零学Go并完成实战项目,完工总结:目录结构
前端·后端·go
妙码生花2 小时前
利用AI从零学Go并完成实战项目,完工总结:商业级开源产品定位和核心特性介绍
前端·后端·go