Flink SQL 知其所以然:Window TopN 操作

网友投稿 758 2023-06-10

Flink SQL 知其所以然:Window TopN 操作

Flink SQL 知其所以然:Window TopN 操作

大家好,我是老羊,今天我们来学习 Flink SQL 中的 Window TopN 操作。

Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。应用场景:小伙伴萌会问了,我有了 TopN 为啥还需要 Window TopN 呢?还记得上文介绍 TopN 说道的 TopN 时会出现中间结果,从而出现回撤数据的嘛?Window TopN 不会出现回撤数据,因为 Window TopN 实现是在窗口结束时输出最终结果,不会产生中间结果。而且注意,因为是窗口上面的操作,Window TopN 在窗口结束时,会自动把 State 给清除。SQL 语法标准:

SELECT [column_list]FROM ( SELECT [column_list], ROW_NUMBER() OVER (PARTITION BY window_start, window_end [, col_key1...] ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum FROM table_name) -- windowing TVFWHERE rownum <= N [AND conditions]

实际案例:取当前这一分钟的搜索关键词下的搜索热度前 10 名的词条数据。

输入表字段:

-- 字段名 备注-- key 搜索关键词-- name 搜索热度名称-- search_cnt 热搜消费热度(比如 3000)-- timestamp 消费词条时间戳CREATE TABLE source_table ( name BIGINT NOT NULL, search_cnt BIGINT NOT NULL, key BIGINT NOT NULL, row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)), WATERMARK FOR row_time AS row_time) WITH ( ...);-- 输出表字段:-- 字段名 备注-- key 搜索关键词-- name 搜索热度名称-- search_cnt 热搜消费热度(比如 3000)-- window_start 窗口开始时间戳-- window_end 窗口结束时间戳CREATE TABLE sink_table ( key BIGINT, name BIGINT, search_cnt BIGINT, window_start TIMESTAMP(3), window_end TIMESTAMP(3)) WITH ( ...);-- 处理 sql:INSERT INTO sink_tableSELECT key, name, search_cnt, window_start, window_endFROM ( SELECT key, name, search_cnt, window_start, window_end, ROW_NUMBER() OVER (PARTITION BY window_start, window_end, key ORDER BY search_cnt desc) AS rownum FROM ( SELECT window_start, window_end, key, name, max(search_cnt) as search_cnt -- window tvf 写法 FROM TABLE(TUMBLE(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '1' MINUTES)) GROUP BY window_start, window_end, key, name ))WHERE rownum <= 100

输出结果:

+I[关键词1, 词条1, 8670, 2021-1-28T22:34, 2021-1-28T22:35]+I[关键词1, 词条2, 6928, 2021-1-28T22:34, 2021-1-28T22:35]+I[关键词1, 词条3, 1735, 2021-1-28T22:34, 2021-1-28T22:35]+I[关键词1, 词条4, 7287, 2021-1-28T22:34, 2021-1-28T22:35]...

可以看到结果是符合预期的,其中没有回撤数据。

SQL 语义。

数据源:数据源即最新的词条下面的搜索词的搜索热度数据,消费到 Kafka 中数据后,将数据按照窗口聚合的 key 通过 hash 分发策略发送到下游窗口聚合算子。窗口聚合算子:进行窗口聚合计算,随着时间的推进,将窗口聚合结果计算完成发往下游窗口排序算子。窗口排序算子:这个算子其实也是一个窗口算子,只不过这个窗口算子为每个 Key 维护了一个 TopN 的榜单数据,接受到上游发送的窗口结果数据进行排序,随着时间的推进,窗口的结束,将排序的结果输出到下游数据汇算子。数据汇:接收到上游的数据之后,然后输出到外部存储引擎中。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Redis 内存优化神技,小内存保存大数据
下一篇:海量数据冷热分离方案与实践
相关文章