微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Flink 对非键控数据流实现聚合操作?

如何解决如何使用 Flink 对非键控数据流实现聚合操作?

我想实现以下案例:

 1. select count(1) from user; 
 
 2. select count(distinct uid) from user;

但是,聚合操作不能用于非键控流。

非键控流不能使用键控状态,我不知道该怎么办,谁能帮我,谢谢!

您可以使用 Table API 执行此操作,但我想知道如何在 DataSteam API 中执行此操作。

解决方法

使用 Table API 是推荐的方法。通过使用 DataStream API,您可能会做更多的工作并得到性能较低的解决方案。

但是,要回答您的问题:

在这两种情况下,如果你想使用 DataStream API 并且不关心并行做事,你可以通过一个常量键控流,然后使用键控状态。

要并行化 count(1) 情况,您可以通过 something 键控流,以便对流进行分区。然后在一组并行计数任务中,您可以对小批量进行计数,并将批量计数更新(作为变更日志流)向下游发送到汇总/报告任务的单个实例。或者您可以使用 non-keyed state 构建解决方案。

要并行处理 count(distinct user) 情况,您可以根据 Table API 中实现的方法为您的解决方案建模——请参阅 the docs。简而言之,它的工作原理是将 select count(distinct uid) from user 转换为

SELECT SUM(cnt)
FROM (
    SELECT COUNT(DISTINCT uid) as cnt
    FROM T
    GROUP BY MOD(HASH_CODE(uid),1024)
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。