ITPub博客

首页 > 大数据 > Hadoop > Flink SQL - 分组聚合

Flink SQL - 分组聚合

原创 Hadoop 作者:元亨利贞 时间:2023-07-21 16:32:35 0 删除 编辑

介绍

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);
复制

以上这些分组聚合方式都适用于批处理和流处理场景,但是对于流处理场景,需要注意以下几点:

  • 分组聚合会产生无限增长的状态,因为每个分组都需要保存聚合结果。状态的大小取决于分组的数量和复杂度以及聚合函数的类型。为了防止状态过大,可以设置状态的过期时间(TTL),但是这可能会影响查询结果的正确性。
  • 分组聚合会根据输入数据的更新来更新输出结果,如果有迟到数据到达,会撤回之前的结果并发送新的结果。这意味着分组聚合没有时间语义,不会根据水印来触发计算和输出。
  • 分组聚合可以和窗口聚合结合使用,通过在  GROUP BY 子句中指定窗口函数来实现按照时间维度进行分组和聚合。

  • 想要将结果表转换成流或输出到外部系统,必须采用撤回流(retract stream)或更新插入流(upsert stream)的编码方式;如果在代码中直接转换成DataStream打印输出,需要调用toChangelogStream()。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024433/viewspace-2965717/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-11-21

  • 博文量
    383
  • 访问量
    247996