- Flink SQL 对于批处理(Batch)和流处理(streaming)模式的SQL,都支持 Top-N 查询。
- Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。并且该结果集还可用于进一步分析。
- Flink 使用 OVER 窗口子句和过滤条件的组合来表达一个 Top-N 查询。借助 OVER 窗口的 PARTITION BY 子句能力,Flink 也能支持分组 Top-N。
1、SQL 语法标准:
SELECT [column_list]
FROM (
SELECT [column_list],
ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]]
ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum
FROM table_name)
WHERE rownum <= N [AND conditions]
#eg: 按dataType分组,分别取每组id前10的数据
SELECT `date`,dataType,id #date是保留关键字,需要用飘号引起来
FROM (
SELECT `date`,dataType,id,
ROW_NUMBER() OVER (PARTITION BY dataType ORDER BY id ) AS rownum
FROM table_name)
WHERE rownum <= 10
2、参数说明:
- ROW_NUMBER():根据分区数据的排序,为每一行分配一个唯一且连续的序号,从 1 开始。目前,只支持 ROW_NUMBER 作为 OVER 窗口函数。未来会支持 RANK() 和 DENSE_RANK()。
- PARTITION BY col1[, col2…]:指定分区字段。每个分区都会有一个 Top-N 的结果。
- ORDER BY col1 [asc|desc][, col2 [asc|desc]…]: 指定排序列。 每个列的排序类型(ASC/DESC)可以不同。
- WHERE rownum <= N: Flink 需要 rownum <= N 才能识别此查询是 Top-N 查询。 N 表示将要保留 N 个最大或最小数据。
- [AND conditions]: 可以在 WHERE 子句中添加其他条件,但是这些其他条件和 rownum <= N 需要使用 AND 结合。
3、注意事项:
输出的位置必须支持更新,比如mysql、clickhouse等关系型数据库,print等
文件系统只支持追加,不可以输出到文件系统,否则会报错误:文章来源地址https://www.toymoban.com/news/detail-659585.html
Exception in thread "main" org.apache.flink.table.api.TableException: Table sink 'default_catalog.default_database.sink_order' doesn't support consuming update and delete changes which is produced by node Rank(strategy=[UndefinedStrategy], rankType=[ROW_NUMBER], rankRange=[rankStart=1, rankEnd=10], partitionBy=[dataType], orderBy=[id ASC], select=[date, source_length])
文章来源:https://www.toymoban.com/news/detail-659585.html
到了这里,关于Flink SQL TopN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!