
流计算是指实时地对流式数据进行计算、分析、与转换。与传统批处理不同,流数据是无边界的——它持续不断地产生,这些数据没有明确的终点,时刻都在更新。为了对这种无限数据流进行分析,我们需要将其划分为一个个有边界的窗口(Window),然后在每个窗口内执行计算。
Datalayers 提供丰富的流式窗口机制。目前支持 5 种核心窗口类型:固定时间窗口、滑动时间窗口、会话窗口、计数窗口、状态窗口,覆盖从基础聚合到复杂行为分析的常见场景,并支持实时与历史数据结合分析。
本文将系统解析 Datalayers 流式窗口的工作原理、不同类型窗口的适用场景,以及如何通过 SQL 语法快速实现窗口计算。无论您是希望优化实时监控系统,还是构建智能推荐引擎,这些技术都能为您提供关键支持。
Datalayers 目前支持五种窗口类型(分为时间窗口与非时间窗口两大类),涵盖了流式窗口计算的主要应用场景。每种窗口类型都有其独特的特点和适用场景,下面我们将逐一解析。
固定时间窗口,也称为翻滚窗口,表示在时间轴上以固定步长移动窗口,且步长等于窗口大小。这种窗口总是连续的,相互之间没有缝隙,也不重叠。

固定时间窗口适用于需要将数据划分为统一、独立的时段进行分析的场景,以便获取易于跨时段比较的指标和洞察。典型应用场景举例:
滑动时间窗口与固定窗口相似,但允许窗口的移动步长小于、等于或大于窗口大小。因此窗口之间可能有重叠,也可能有缝隙。

滑动时间窗口适用于需要持续实时分析的场景。典型应用场景举例:
工业设备预测性维护 对数控机床振动数据采用"30秒窗口/5秒滑动步长"实时计算FFT频谱,当检测到特定频率振幅连续3个窗口超标时,预判轴承磨损风险。 网络攻击检测 网络安全系统通过"10分钟窗口/1分钟滑动步长"监测端口访问频次,动态识别DDoS攻击特征,在攻击规模扩大前启动流量清洗。 实时推荐优化 短视频平台基于"1小时窗口/10分钟滑动步长"分析用户互动行为,每10分钟更新一次推荐权重,实现推荐内容的动态调优。
会话窗口根据时间的邻近度来划分窗口。连续的、时间相近的行被划分到一个窗口。当遇到时间间隙较大的行时,当前窗口关闭,新窗口开始。

会话窗口是分析用户行为的理想选择。典型应用场景举例:
按固定的行数来划分窗口。例如给定窗口大小 3,则连续的 3 行数据总是被划分为同一个窗口,窗口之间连续且不重叠。
计数窗口适用于需要将数据按照固定次数进行划分,然后统一进行分析的场景。典型应用场景举例:
实时采样监控 在物联网设备监测中,每100条传感器读数划分为一个窗口进行均值计算,既能降低数据传输频率,又能保持数据代表性。 日志批量处理 对高频产生的系统日志(如API调用记录)按每500条为一个窗口进行聚合分析,统计各接口的调用频次和平均耗时,实现资源消耗的批量监控。 金融交易风控 在证券交易系统中,对每20笔连续委托单计算买卖比例,当窗口内卖出占比超过80%时触发异常交易预警,防范程序化交易风险。
根据状态划分窗口。连续的、相同状态的行被划为一个窗口。当状态改变时,当前窗口关闭,新窗口开始。
状态窗口适用于需要根据状态对数据进行划分,然后分状态进行分析的场景。典型应用场景举例:
设备状态分析 工厂流水线传感器数据按设备运行状态("待机/运行/故障")划分窗口,统计各状态的持续时长。当"故障"状态窗口超过5分钟时自动触发维修工单。 用户会话分类 电商平台根据用户行为标记("浏览/加购/付款")创建状态窗口,分析每个行为阶段的转化漏斗。特别追踪"加购未付款"窗口的持续时长,优化购物车提醒策略。 交通流量监测 智能交通系统根据信号灯状态("红灯/绿灯/黄灯")划分车流数据窗口,计算各灯态期间通过路口的平均车辆数,动态调整信号灯配时方案。
我们首先创建一张 device_metrics 表,用于存储设备监控数据。表结构包含如下三列:
> CREATE TABLE device_metrics (
ts TIMESTAMP(3) NOT NULL,
device_id BIGINT NOT NULL,
value DOUBLE,
timestamp key(ts)
)
PARTITION BY HASH (device_id) PARTITIONS 4
ENGINE=TimeSeries;
给这张表插入一些示例数据:
> INSERT INTO device_metrics (ts, device_id, value) VALUES
('2023-01-01T08:00:00+08:00', 1, 5.0),
('2023-01-01T08:05:00+08:00', 1, 10.0),
('2023-01-01T08:10:00+08:00', 1, NULL),
('2023-01-01T08:15:00+08:00', 2, 7.0),
('2023-01-01T08:20:00+08:00', 2, 15.0),
('2023-01-01T08:25:00+08:00', 2, 20.0),
('2023-01-01T08:30:00+08:00', 2, NULL);
Datalayers 通过扩展函数实现流式窗口计算,语法与标准 SQL 保持一致。以下以滑动时间窗口为例:窗口大小为 10 分钟、滑动步长为 5 分钟,计算各窗口内指标记录数。
> SELECT
window_start(ts) as start,
window_end(ts) as end,
window_duration(ts) as duration,
COUNT(*)
FROM device_metrics
GROUP BY slide_window(ts, interval 10 minute, interval 5 minute)
+---------------------------+---------------------------+----------+----------+
| start | end | duration | count(*) |
+---------------------------+---------------------------+----------+----------+
| 2023-01-01T08:00:00+08:00 | 2023-01-01T08:00:00+08:00 | P0D | 1 |
| 2023-01-01T08:00:00+08:00 | 2023-01-01T08:05:00+08:00 | PT300S | 2 |
| 2023-01-01T08:05:00+08:00 | 2023-01-01T08:10:00+08:00 | PT300S | 2 |
| 2023-01-01T08:10:00+08:00 | 2023-01-01T08:15:00+08:00 | PT300S | 2 |
| 2023-01-01T08:15:00+08:00 | 2023-01-01T08:20:00+08:00 | PT300S | 2 |
| 2023-01-01T08:20:00+08:00 | 2023-01-01T08:25:00+08:00 | PT300S | 2 |
| 2023-01-01T08:25:00+08:00 | 2023-01-01T08:30:00+08:00 | PT300S | 2 |
| 2023-01-01T08:30:00+08:00 | 2023-01-01T08:30:00+08:00 | P0D | 1 |
+---------------------------+---------------------------+----------+----------+
在上述查询 SQL 中,我们还使用了 Datalayers 提供的一系列计算窗口元信息的函数,这对于调试以及理解数据非常有价值。这些函数包括:
对于时间跨度,我们使用 ISO 8601 格式打印。例如 P0D 表示跨度为 0 天、 PT300S 表示跨度为 300 秒。
Datalayers 的流式窗口能力类型完整、语法统一,便于在同一 SQL 体系下完成实时聚合与行为分析。通过合理选择窗口类型与参数,开发者可以在准确性与时效性之间取得更优平衡。 更详细的使用说明请参考流式窗口函数。
高性能、云原生的时序数据存储引擎,轻松应对海量数据的写入与查询