时序数据库flux aggregateWindow命令详解
在 InfluxDB 的 Flux 语言中,aggregateWindow()
是一个用于时间序列数据聚合的核心函数,它能按照指定的时间窗口对数据进行分组,并对每个窗口内的数据应用聚合函数(如求和、平均值等)。这在处理时序数据时非常实用,比如将秒级数据聚合为分钟级、小时级等。
基本语法
aggregateWindow(every: duration, // 窗口大小(必填)fn: (column, tables) => any, // 聚合函数(必填)column: string, // 要聚合的列名(可选,默认是 "_value")timeSrc: string, // 时间列来源(可选,默认是 "_time")timeDst: string, // 聚合后时间列的名称(可选,默认是 "_time")createEmpty: bool // 是否保留空窗口(可选,默认是 false)
)
参数详解
every
(必填)
定义时间窗口的大小,即每隔多久聚合一次。支持的时间单位:ns
(纳秒)、us
(微秒)、ms
(毫秒)、s
(秒)、m
(分钟)、h
(小时)、d
(天)、w
(周)等。
示例:every: 1m
(1 分钟窗口)、every: 1h
(1 小时窗口)。fn
(必填)
用于聚合窗口内数据的函数。Flux 内置了常用聚合函数,如:mean()
:平均值sum()
:求和max()
:最大值min()
:最小值count()
:计数
示例:fn: mean
表示计算每个窗口内的平均值。
column
(可选)
指定要聚合的字段列名,默认是_value
(InfluxDB 中存储数值的默认列)。
示例:column: "temperature"
表示聚合temperature
列。timeSrc
(可选)
指定原始时间列的名称,默认是_time
(InfluxDB 中存储时间的默认列)。一般无需修改,除非自定义了时间列。timeDst
(可选)
指定聚合后时间列的名称,默认是_time
。聚合后的时间通常是窗口的起始时间(或结束时间,取决于数据对齐方式)。createEmpty
(可选)
布尔值,指定是否保留没有数据的空窗口。默认是false
(不保留空窗口);设为true
时,空窗口会显示null
或0
(取决于聚合函数)。
使用示例
假设我们有一张名为 sensor_data
的表,包含 _time
(时间)、_value
(数值)、sensor_id
(传感器 ID)字段,记录了传感器的温度数据(每秒一条)。
示例 1:按 10 分钟窗口聚合,计算平均温度
from(bucket: "my-bucket")|> range(start: -1h) // 取过去1小时的数据|> filter(fn: (r) => r._measurement == "sensor_data" and r._field == "temperature")|> aggregateWindow(every: 10m, // 每10分钟一个窗口fn: mean, // 计算平均值column: "_value" // 聚合_value列(默认可省略))|> yield(name: "mean_temperature")
结果会将过去 1 小时的数据按 10 分钟分组,每组计算一个平均温度。
示例 2:保留空窗口,按 1 小时聚合求和
from(bucket: "my-bucket")|> range(start: -1d) // 取过去1天的数据|> filter(fn: (r) => r._measurement == "energy" and r._field == "consumption")|> aggregateWindow(every: 1h,fn: sum,createEmpty: true // 保留无数据的小时窗口(显示0))|> yield(name: "hourly_energy_sum")
示例 3:按标签分组后聚合
如果数据有多个标签(如不同传感器),可先按标签分组再聚合:
from(bucket: "my-bucket")|> range(start: -6h)|> filter(fn: (r) => r._measurement == "sensor_data" and r._field == "humidity")|> group(columns: ["sensor_id"]) // 按传感器ID分组|> aggregateWindow(every: 30m,fn: max // 每个传感器每30分钟的最大湿度)|> yield(name: "max_humidity_per_sensor")
注意事项
- 窗口对齐:
aggregateWindow()
的窗口默认对齐到 Unix 时间起点(如 00:00、00:10、00:20 等),而非数据的第一条记录时间。 - 与
window()
的区别:window()
仅按时间分组,不做聚合;aggregateWindow()
是window()
+ 聚合函数的组合,更简洁。 - 性能:对大量数据聚合时,建议通过
range()
限制时间范围,或通过filter()
过滤不必要的数据,提升效率。
通过 aggregateWindow()
,可以灵活地将高频时序数据降采样为低频数据,便于分析和可视化。