如何处理FlinkSQL窗口中的迟到数据(Late Data)?

提问者:帅平 问题分类:面试刷题
如何处理FlinkSQL窗口中的迟到数据(Late Data)?
2 个回答
勿忘心安
勿忘心安
处理窗口中的迟到数据(Late Data)​需要结合水印(Watermark)​、延迟容忍(Allowed Lateness)​和侧输出(Side Output)​机制。
1、水印和延迟容忍
-- 定义事件时间字段和水印(允许5秒延迟)
CREATE TABLE orders (
  order_id STRING,
  amount DOUBLE,
  event_time TIMESTAMP(3),
  WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (...);
-- 窗口配置(允许延迟5秒)
SELECT 
  TUMBLE_START(event_time, INTERVAL '1' MINUTE) AS window_start,
  SUM(amount) AS total_amount
FROM orders
GROUP BY 
  TUMBLE(event_time, INTERVAL '1' MINUTE)
  -- 允许窗口触发后5秒内接受迟到数据
  WITHIN INTERVAL '1' MINUTE
  ALLOWED_LATENESS INTERVAL '5' SECOND;
发布于:1周前 (05-28) IP属地:
浅笑嫣然待花开
浅笑嫣然待花开
2、侧输出
-- 定义侧输出标签
DEFINE LATE_DATA_OUTPUT TAG 'late_data';
-- 主查询(主窗口计算)
SELECT 
  TUMBLE_START(event_time, INTERVAL '1' MINUTE) AS window_start,
  SUM(amount) AS total_amount
FROM orders
GROUP BY 
  TUMBLE(event_time, INTERVAL '1' MINUTE)
  -- 允许延迟5秒
  WITHIN INTERVAL '1' MINUTE
  ALLOWED_LATENESS INTERVAL '5' SECOND
  -- 侧输出迟到数据
  OUTPUT LATE_DATA_OUTPUT;
-- 查询侧输出流
SELECT * FROM LATE_DATA_OUTPUT;
发布于:1周前 (05-28) IP属地:
我来回答