如何在flink中将累积值转换为增量值(一些键被认为是用户,然后累积值变成相邻两个键的增量值(,然后在增量值(时间维度,一个键(的基础上进行聚合(求和(
例如,原始数据为:
时间A B值
0 1 1 1
0 2 2 2
0 1 1 4
0 2 2 3
1 1 1 5
1 2 2 6
转换为增量后,我们得到
时间A B值
0 1 1 1
0 2 2 2
0 1 1 3
0 2 2 1
1 1 1 2
1 2 2 3
然后我们通过(时间,A(进行聚合,得到的最终结果是
时间A值
0 1 4
0 2 3
1 1 2
1 2 3
有没有一个程序可以同时做这两件事?一种解决方案是使用会话窗口或全局窗口将原始表转换为增量表并将其存储在另一个位置,然后启动另一个任务来聚合结果?但这将消耗额外的存储空间。
抱歉我英语不好,谢谢你的建议。
不需要有两个单独的应用程序,也不需要存储任何东西。让第一步的输出流入第二步。从概念上讲,这就是
results = input
.somehowDoTheIncrementalPart()
.thenAggregate();
或者在SQL中,您可以使用嵌套查询,比如
SELECT ts, sum(diff) FROM (
SELECT ts, userId, diff
FROM events
MATCH_RECOGNIZE (
PARTITION BY id
ORDER BY ts
MEASURES
p2.v - p1.v AS diff, p2.id AS userId, p2.ts AS ts
AFTER MATCH SKIP TO LAST p2
PATTERN (p1 p2)
DEFINE p1 AS TRUE, p2 AS TRUE )
) GROUP BY ts, userId