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- 窗口分区持续时间。
相关推荐
木雷坞7 小时前
Go 项目实战:用 MLiev IAM 落地企业认证中心
后端·golang·认证
weelinking10 小时前
【产品】12_接入数据库——让数据永久保存
jvm·数据库·python·react.js·数据挖掘·前端框架·产品经理
稳联技术老娜10 小时前
DeviceNet主站怎么连接西门子PLC,Profinet网关配置手册(那智机器人)
服务器·网络·数据库
这个DBA有点耶10 小时前
云上运维新挑战:当数据库不再“看得见摸得着”
数据库·sql·程序人生·云原生·运维开发·学习方法·dba
AskHarries11 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment12 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
消失在人海中12 小时前
oracle 数据库多表关联查询
服务器·数据库·oracle
九皇叔叔12 小时前
PostgreSQL/openGauss pg_stats 视图从入门到精通:统计信息、执行计划与慢 SQL 优化实战
数据库·sql·postgresql
蝎子莱莱爱打怪13 小时前
🚀 🚀🚀2026年5月GitHub月榜精选:17个项目中挑出10个推荐,实操4个!
人工智能·后端·ai编程
南极企鹅13 小时前
MySQL间隙锁&临键锁
数据库·sql·mysql