如何使用 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)
)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...