首页 > 大数据 > Hadoop > Flink SQL - 分组聚合
Flink SQL 支持多种分组聚合的方式,用于对数据按照不同的维度进行统计和计算。分组聚合是 SQL 中常用的数据分析方法,可以使用各种内置或自定义的聚合函数,如
COUNT、
SUM、
AVG、
MAX、
MIN 等。
Flink SQL 中的分组聚合可以分为以下几种:
GROUP BY 子句:这是最基本的分组聚合方式,可以按照一个或多个字段或表达式对数据进行分组,并对每个组进行聚合。例如:SELECT supplier_id, rating, COUNT(*) AS totalFROM ProductsGROUP BY supplier_id, rating;复制
DISTINCT 聚合:这种方式可以在聚合函数前去除重复的数据,只对不同的值进行聚合。例如:SELECT COUNT(DISTINCT order_id) FROM Orders;复制
GROUPING SETS 子句:这种方式可以在一个
GROUP BY 语句中指定多个分组集合,相当于执行了多个分组聚合查询并将结果合并。每个分组集合可以是空的,单个字段或表达式,或者多个字段或表达式的列表。例如:SELECT supplier_id, rating, COUNT(*) AS totalFROM ProductsGROUP BY GROUPING SETS ( (supplier_id, rating), (supplier_id), () );复制
ROLLUP 子句:这种方式是一种特殊的
GROUPING SETS 的简写,相当于指定了一个字段或表达式列表以及它们所有的前缀列表,包括空列表。例如:SELECT supplier_id, rating, COUNT(*) AS totalFROM ProductsGROUP BY ROLLUP (supplier_id, rating);复制
CUBE 子句:这种方式也是一种特殊的
GROUPING SETS 的简写,相当于指定了一个字段或表达式列表以及它们所有可能的子集和幂集。例如:SELECT supplier_id, rating, product_id, COUNT(*) AS totalFROM ProductsGROUP BY CUBE (supplier_id, rating, product_id);复制
以上这些分组聚合方式都适用于批处理和流处理场景,但是对于流处理场景,需要注意以下几点:
分组聚合可以和窗口聚合结合使用,通过在
GROUP BY 子句中指定窗口函数来实现按照时间维度进行分组和聚合。
想要将结果表转换成流或输出到外部系统,必须采用撤回流(retract stream)或更新插入流(upsert stream)的编码方式;如果在代码中直接转换成DataStream打印输出,需要调用toChangelogStream()。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024433/viewspace-2965717/ ,如需转载,请注明出处,否则将追究法律责任。