Flink SQL TopN

  • Flink SQL 对于批处理(Batch)和流处理(streaming)模式的SQL,都支持 Top-N 查询。
  • Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。并且该结果集还可用于进一步分析。
  • Flink 使用 OVER 窗口子句和过滤条件的组合来表达一个 Top-N 查询。借助 OVER 窗口的 PARTITION BY 子句能力,Flink 也能支持分组 Top-N。

1、SQL 语法标准:

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]

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 结合。

输出的位置必须支持更新,比如mysql、clickhouse等关系型数据库,print等

不可以输出到文件系统,否则会报错误:

bash 复制代码
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])
相关推荐
杰克逊的日记12 小时前
Flink运维要点
大数据·运维·flink
张伯毅17 小时前
Flink SQL 将kafka topic的数据写到另外一个topic里面
sql·flink·kafka
菜鸟冲锋号19 小时前
Flink SQL、Hudi 、Doris在数据上的组合应用
大数据·flink
maozexijr1 天前
Flink 的任务槽和槽共享
大数据·flink
强哥叨逼叨2 天前
没经过我同意,flink window就把数据存到state里的了?
大数据·flink
董可伦3 天前
Dinky 安装部署并配置提交 Flink Yarn 任务
android·adb·flink
千叶真尹7 天前
基于Flink的用户画像 OLAP 实时数仓统计分析
flink
从头再来的码农8 天前
大数据Flink相关面试题(一)
大数据·flink
MarkHD9 天前
第四天 从CAN总线到Spark/Flink实时处理
大数据·flink·spark
SparkSql9 天前
FlinkCDC采集MySQL8.4报错
大数据·flink