上一篇
最新动态 📢
根据2025年8月Apache社区发布的技术简报,Flink 2.5版本对Over聚合进行了重大优化,窗口计算性能提升达40%!特别是在处理乱序事件时,新的水位线机制让结果准确性大幅提高,今天我们就来彻底拆解这个流处理中的"瑞士军刀"~
想象你正在看股票行情,突然想知道:"这只股票过去5分钟的移动平均价是多少?" —— 这就是Over聚合的典型场景!✨
SELECT stock_id, price, AVG(price) OVER ( PARTITION BY stock_id ORDER BY event_time RANGE BETWEEN INTERVAL '5' MINUTE PRECEDING AND CURRENT ROW ) AS moving_avg FROM stock_trades
与传统GROUP BY不同,Over聚合能:
graph LR A[原始数据流] --> B{分区键提取} B --> C[按分区排序] C --> D[窗口缓冲区] D --> E[聚合计算] E --> F[结果输出]
关键点在于:
RANGE BETWEEN INTERVAL '10' SECOND PRECEDING AND CURRENT ROW
ROWS BETWEEN 5 PRECEDING AND CURRENT ROW
# 伪代码展示窗口存储结构 class WindowBuffer: def __init__(self): self.sorted_list = SortedList() # 使用跳表优化插入性能 self.expiry_queue = deque() # 过期数据快速清理
2025版本新增:
-- 设置合理的分区数 SET table.exec.window-aggregate.hash-bucket-size = 1024;
经验值:
numBufferedRowsPerPartition
[ERROR] Could not compute window boundaries for row...
可能原因:
NULLS LAST
处理)state.size
指标(预防OOM)场景:计算每用户最近3次点击的时长标准差
-- 旧写法(性能较差) SELECT user_id, STDDEV(duration) OVER ( PARTITION BY user_id ORDER BY click_time ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) FROM clicks; -- 2025推荐写法(利用新优化器) WITH ranked_clicks AS ( SELECT user_id, duration, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY click_time DESC) AS rn FROM clicks ) SELECT user_id, STDDEV(duration) FROM ranked_clicks WHERE rn <= 3 GROUP BY user_id;
根据2025路线图,Over聚合将支持:
💡 小测验:当处理迟到数据时,Flink的Over聚合会怎样处理?(答案:2.5版本新增了allowLateEvents
配置项,可以控制是否更新已发出结果)
本文由 斋光远 于2025-08-03发表在【云服务器提供商】,文中图片由(斋光远)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/529874.html
发表评论