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

发布时间:2025-05-16 14:47:21 作者:益华网络 来源:undefined 浏览量(1) 点赞(2)
摘要:大家好,我是老羊,今天我们来学习 Flink SQL 中的 Window TopN 操作。 Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。应用场景:小伙伴萌会问了,我有了 TopN 为啥还需要 Window TopN 呢?还记得上文介绍 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 TVF

WHERE 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_table

SELECT key, name, search_cnt, window_start, window_end

FROM (

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 的榜单数据,接受到上游发送的窗口结果数据进行排序,随着时间的推进,窗口的结束,将排序的结果输出到下游数据汇算子。数据汇:接收到上游的数据之后,然后输出到外部存储引擎中。

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!