我想实现以下情况:
1. select count(1) from user;
2. select count(distinct uid) from user;
但是,聚合操作不能用于非键控流。
非键控流不能使用键控状态,我不知道该怎么办,有人能帮我吗,谢谢!
您可以使用Table API来完成此操作,但我想知道如何在DataTeam API中完成此操作。
建议使用表API。通过使用DataStream API,您可能会做更多的工作并获得性能较低的解决方案。
然而,要回答您的问题:
在这两种情况下,如果您想使用DataStream API,而不关心并行执行,则可以通过常量对流进行键控,然后使用键控状态。
为了并行化count(1)
的情况,您可以通过something对流进行键控,以便对流进行分区。然后,在一组并行计数任务中,您可以对小批量进行计数,并将批量计数更新(作为变更日志流(发送到汇总/报告任务的单个实例的下游。或者,您可以使用非键控状态来构建解决方案。
为了并行化count(distinct user)
案例,您可以根据表API中实现的方法对解决方案进行建模——请参阅文档。简而言之,它的工作原理是将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)
)