学生
student_id name
11 foo
学科分数
id name score std_id
100 math 97 11
101 english 98 11
有如下一个场景(假设只有一个学生)
基于binlog检测这2个表的变化, 计算这个学生的总分数, 使用了Table/SQL API join操作计算
假设insert以上数据后到达某时刻, 以上数据都进入了flink, 计算出这个学生总分数 97 + 98 = 195
但此时发现学生姓名登记错误, 于是进行了修改,
结果此时Flink中学生流中有2个事件(insert的一个+update的一个), 分数流中有2个事件, 计算的总分数就会是 2 * (97 +
98) = 390
Q: 请问这种场景下使用什么能够解决, 计算出正确的结果 97 + 98 = 193
接触flink不久, 不是太了解, 请大佬给个提示, 谢谢!!*来自志愿者整理的flink邮件归档
实际场景还是有点复杂的, 便于理解 我简化成这样的, 简化后的这个, 没有实际的代码, 抱歉
大致 写一下 也就是这样了
select sum(score)
from
student t1 inner join score t2 on t1.student_id = t2.std_id
where
t1.student_id = 11
然后
String sql = ↑;
Table t = tEnv.sqlQuery(sql);
DataStream<Integer> stream1 = tEnv.toAppendStream(t, Integer.class);
stream1.keyBy("xxxx").sum("xxxx");
这样的一个sql, 在student表插入一个数据, score表插入2个数据后, 会执行一次计算出一个结果97 + 98
update 学生表的name后, 一个新事件进入student的流, 还会触发一次计算, 得到97 + 98
因为可能有新的成绩插入, 所以对 stream1进行sum操作, 导致 97和98 都被重复计算了一次*来自志愿者整理的FLINK邮件归档
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。