【FlinkSQL笔记】(三)Flink SQL 核心重难点(窗口函数、水印)

一、窗口函数

流式数据无限无边界,例如想要统计每5分钟、每1小时的数据,必须用窗口函数,这是Flink SQL和普通SQL最大的区别之一。

1、 滚动窗口 TUMBLE(最常用)

特点:无重叠、无间隔、固定时长,适合定时统计(每1分钟、每5分钟)

语法:TUMBLE(时间字段, 间隔时长)

sql 复制代码
-- 每1分钟统计每辆车数据上报次数
SELECT
    vin,
    TUMBLE_START(event_time, INTERVAL '1' MINUTE) AS window_start,
    TUMBLE_END(event_time, INTERVAL '1' MINUTE) AS window_end,
    COUNT(*) AS total_count
FROM kafka_source
GROUP BY vin, TUMBLE(event_time, INTERVAL '1' MINUTE);

2、滑动窗口 HOP

特点:有重叠、高频刷新,适合实时高频监控(每30秒刷新最近1分钟数据)

语法:HOP(时间字段, 滑动步长, 窗口时长)

sql 复制代码
-- 每30秒刷新一次,统计最近1分钟数据
SELECT
    vin,
    HOP_START(event_time, INTERVAL '30' SECOND, INTERVAL '1' MINUTE) AS window_start,
    HOP_END(event_time, INTERVAL '30' SECOND, INTERVAL '1' MINUTE) AS window_end,
    COUNT(*) AS total_count
FROM kafka_source
GROUP BY vin, HOP(event_time, INTERVAL '30' SECOND, INTERVAL '1' MINUTE);

3 会话窗口 SESSION(不常用)

特点:空闲指定时间无数据,窗口自动关闭,适合用户行为间断性统计,不适合设备时长告警

二、水印 WATERMARK(解决数据乱序)

1、什么是数据乱序

实时场景(车联网、物联网)中,网络波动、设备重连会导致:先产生的数据,后到达Flink,直接导致窗口统计结果错误。

2、水印作用

水印是Flink的时间容错机制:告诉Flink,允许延迟N秒接收乱序数据,超时则不再等待,触发窗口计算。

3、生产标准水印语法

sql 复制代码
-- 容忍5秒乱序,企业通用配置
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND

注:

(1) 小数据量、常规实时任务:5秒

(2)物联网、车联网不稳定数据:10秒

三、完整可运行实战案例

需求:实时统计每辆车1分钟内的数据上报次数

完整可直接运行Flink SQL,适配华为云DataArts/MRS Flink

sql 复制代码
-- 1. 定义Kafka数据源表
CREATE TABLE kafka_source (
    vin STRING,
    online_status INT,
    high_voltage STRING,
    event_time TIMESTAMP(3),
    WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
    'connector' = 'kafka',
    'topic' = 'vehicle_realtime_data',
    'properties.bootstrap.servers' = '127.0.0.1:9092',
    'properties.group.id' = 'flink_sql_demo_group',
    'format' = 'json',
    'scan.startup.mode' = 'latest'
);

-- 2. 定义结果输出表
CREATE TABLE vehicle_stat_sink (
    vin STRING,
    window_start TIMESTAMP(3),
    window_end TIMESTAMP(3),
    report_count BIGINT
) WITH (
    'connector' = 'kafka',
    'topic' = 'vehicle_stat_result',
    'properties.bootstrap.servers' = '127.0.0.1:9092',
    'format' = 'json'
);

-- 3. 实时开窗计算并输出结果
INSERT INTO vehicle_stat_sink
SELECT
    vin,
    TUMBLE_START(event_time, INTERVAL '1' MINUTE) AS window_start,
    TUMBLE_END(event_time, INTERVAL '1' MINUTE) AS window_end,
    COUNT(*) AS report_count
FROM kafka_source
GROUP BY vin, TUMBLE(event_time, INTERVAL '1' MINUTE);
相关推荐
xuhaoyu_cpp_java8 小时前
项目学习(三)分页查询
java·经验分享·笔记·学习
Cloud_Shy61811 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 33 - 35)
开发语言·人工智能·笔记·python·学习方法
做cv的小昊11 小时前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
星恒随风11 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
Theo·Chan14 小时前
机房断电搞崩服务器 | 人大金仓 V8 全量备份跨实例完整恢复实录
sql·信创·kingbase·金仓
伊布拉西莫15 小时前
【流畅的Python】第20章:并发执行器 — 学习笔记
笔记·python·学习
AOwhisky17 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算
持敬chijing17 小时前
Web渗透之SQL注入总结
sql·安全·web安全·网络安全·网络攻击模型·web
niuniuyi~17 小时前
QT学习笔记
笔记·qt·学习
咸甜适中17 小时前
rust语言学习笔记Trait(十六)Error(错误)
笔记·学习·rust