【FlinkSQL笔记】(三)Flink SQL 核心重难点(窗口函数、水印) 一、窗口函数流式数据无限无边界例如想要统计每5分钟、每1小时的数据必须用窗口函数这是Flink SQL和普通SQL最大的区别之一。1、 滚动窗口 TUMBLE最常用特点无重叠、无间隔、固定时长适合定时统计每1分钟、每5分钟语法TUMBLE(时间字段, 间隔时长)-- 每1分钟统计每辆车数据上报次数SELECTvin,TUMBLE_START(event_time,INTERVAL1MINUTE)ASwindow_start,TUMBLE_END(event_time,INTERVAL1MINUTE)ASwindow_end,COUNT(*)AStotal_countFROMkafka_sourceGROUPBYvin,TUMBLE(event_time,INTERVAL1MINUTE);2、滑动窗口 HOP特点有重叠、高频刷新适合实时高频监控每30秒刷新最近1分钟数据语法HOP(时间字段, 滑动步长, 窗口时长)-- 每30秒刷新一次统计最近1分钟数据SELECTvin,HOP_START(event_time,INTERVAL30SECOND,INTERVAL1MINUTE)ASwindow_start,HOP_END(event_time,INTERVAL30SECOND,INTERVAL1MINUTE)ASwindow_end,COUNT(*)AStotal_countFROMkafka_sourceGROUPBYvin,HOP(event_time,INTERVAL30SECOND,INTERVAL1MINUTE);3 会话窗口 SESSION不常用特点空闲指定时间无数据窗口自动关闭适合用户行为间断性统计不适合设备时长告警二、水印 WATERMARK解决数据乱序1、什么是数据乱序实时场景车联网、物联网中网络波动、设备重连会导致先产生的数据后到达Flink直接导致窗口统计结果错误。2、水印作用水印是Flink的时间容错机制告诉Flink允许延迟N秒接收乱序数据超时则不再等待触发窗口计算。3、生产标准水印语法-- 容忍5秒乱序企业通用配置WATERMARKFORevent_timeASevent_time-INTERVAL5SECOND注1 小数据量、常规实时任务5秒2物联网、车联网不稳定数据10秒三、完整可运行实战案例需求实时统计每辆车1分钟内的数据上报次数完整可直接运行Flink SQL适配华为云DataArts/MRS Flink-- 1. 定义Kafka数据源表CREATETABLEkafka_source(vin STRING,online_statusINT,high_voltage STRING,event_timeTIMESTAMP(3),WATERMARKFORevent_timeASevent_time-INTERVAL5SECOND)WITH(connectorkafka,topicvehicle_realtime_data,properties.bootstrap.servers127.0.0.1:9092,properties.group.idflink_sql_demo_group,formatjson,scan.startup.modelatest);-- 2. 定义结果输出表CREATETABLEvehicle_stat_sink(vin STRING,window_startTIMESTAMP(3),window_endTIMESTAMP(3),report_countBIGINT)WITH(connectorkafka,topicvehicle_stat_result,properties.bootstrap.servers127.0.0.1:9092,formatjson);-- 3. 实时开窗计算并输出结果INSERTINTOvehicle_stat_sinkSELECTvin,TUMBLE_START(event_time,INTERVAL1MINUTE)ASwindow_start,TUMBLE_END(event_time,INTERVAL1MINUTE)ASwindow_end,COUNT(*)ASreport_countFROMkafka_sourceGROUPBYvin,TUMBLE(event_time,INTERVAL1MINUTE);