深入解读 Flink SQL 1.13
最近一直在努力学习Flink,刚刚好社区发布1.13版本,学习之余协助社区发布了一篇文章,欢迎各位看看
文章介绍:Flink1.13版本于最近发布了,里面有比较多新的Feature和特性,今天就由我和徐榜江老师带着大家一起去探寻这些新特性,还有一些改进。徐榜江老师目前就职于阿里巴巴 Flink-SQL引擎团队,主要负责社区的SQL引擎模块开发。这篇文章一共会分为4个部分,首先我们会先给大家介绍Flink-SQL在1.13版本上面整体的一个改动,还有一些核心Feature的解读和重要改进,最后就是总结以及Flink1.14一些功能提前和大家剧透。
作者:徐榜江 (Apache Flink PMC)
整理:陈政羽(Apache Flink China 社区志愿者)
Flink SQL 1.13概览
Flink-SQL 1.13是一个社区大版本,解决的issue在1000+以上,通过图中我们可以看到解决的问题大部分是关于Table-SQL模块,一共400多个issue占了37%左右,主要是围绕了其中的5个Flip进行展开,稍后文章我们也会根据这5个进行描述,它们分别是
- FLIP-145: 支持 Window TVF
- FLIP-162: SQL层面把时区和时间函数进行修正优化
- FLIP-152: 提升 Hive 语法兼容性
- FLIP-163: 改进 SQL Client,使得生产基本可用
- FLIP-136: 增强 DataStream 和 Table 的转换的增强
下面我们来通过逐个Feature进行解读
FLIP-145:支持Windows TVF
在腾讯、阿里、字节等内部已经有这个功能,这次社区在Flink1.13我们推出了TVF的相关支持和相关优化。下面将从 Window TVF 语法、近实时累计计算场景、 Window 性能优化、多维数据分析进行解剖这个新功能
Window TVF 语法
在1.13 前,是一个特殊的GroupWindowFunction
SELECT
TUMBLE_START(bidtime,INTERVAL '10' MINUTE),
TUMBLE_END(bidtime,INTERVAL '10' MINUTE),
TUMBLE_ROWTIME(bidtime,INTERVAL '10' MINUTE),
SUM(price)
FROM MyTable
GROUP BY TUMBLE(bidtime,INTERVAL '10' MINUTE)
在1.13时候我们对它进行了Table-Valued Function的语法标准化
SELECT window_start,window_end,window_time,SUM(price)
FROM TABLE(TUMBLE(TABLE mytable,DESCRIPTOR(biztime),INTERVAL '10' MINUTE))
GROUP BY window_start,window_end
通过上面的观察,我们可以发现TVF 无需一定要跟在GROUP BY 语法后面,在Window TVF 基于关系代数 ,使得更加标准化。划分窗口只需要TVF,无需再次进行GROUP BY的相关操作;TVF扩展性和表达能力更强,可以自定义TVF(例如topn)
以上例子就是TVF做一个窗口划分,只需要把数据划分到窗口无需聚合,如果后续需要聚合只需要GROPBY即可。对于批的用户操作是很自然的一件事,而不需要像1.13之前做一定需要一个特殊的GROUP Function
目前WINDOW TVF 支持TUMBLE,HOP WINDOW;新增了CUMULATE WINDOW,SESSION WINDOW 预计在1.14支持
Cumulate Window
以图里面一个宽度为单位,第一个window统计一个宽度的数据,第二个window是想统计第一+第二个宽度的数据,第三个window想统计 1 2 3 宽度的数据。这个就是累积计算场景UV。例如:UV大盘曲线:每隔10分钟统计一次当天累积用户uv。在Flink1.13之前,我们需要做这个场景我们一般做法如下
INSERT INTO cumulative_uv