开发者社区> 问答> 正文

求助帖: 流join场景可能出现的重复计算

学生

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邮件归档

展开
收起
彗星halation 2021-12-02 18:17:38 559 0
1 条回答
写回答
取消 提交回答
  • 实际场景还是有点复杂的, 便于理解 我简化成这样的, 简化后的这个, 没有实际的代码, 抱歉

    大致 写一下 也就是这样了

    
    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邮件归档

    2021-12-02 18:31:51
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
4个迭代,从批量交...1573957773.pdf 立即下载
RowKey与索引设计:技巧与案例分析 立即下载
低代码开发师(初级)实战教程 立即下载