V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dtgxx
V2EX  ›  问与答

flink 去重问题请教

  •  
  •   dtgxx · 87 天前 · 422 次点击
    这是一个创建于 87 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教大家一个问题,flink 实时处理 kafka 的 json 数据,比如数据结构里面的 key 有 a 、b 、c ,我需要对 a 相同的所有数据去重,然后输出 a 、b 、c ,例如:
    ① {"a":"1","b":"2","c":"3"} ② {"a":"1","b":"222","c":"333"} 就会认为 ① 和 ② 是重复数据,最终只会输出 ①,只要当天的数据可以这样去重就可以。 在 flink 如何实现这个需求呢?麻烦大佬详细说说。
    4 条回复    2022-08-31 14:52:10 +08:00
    vvtf
        1
    vvtf  
       87 天前   ❤️ 1
    2 种思路,
    1 是使用滑动窗口, 窗口大小为 24h,
    然后去重;

    2 是记录一个上次 a 出现的时间, 如果大于 24h 就重新计算, 小于 24h 就跳过.

    下面是方法 1 的代码:
    ds
    .windowAll(TumblingProcessingTimeWindows.of(Time.hours(24)))
    .process(new ProcessAllWindowFunction<String, String, TimeWindow>() {
    private static final long serialVersionUID = 1L;

    @Override
    public void process(ProcessAllWindowFunction<String, String,
    TimeWindow>.Context ctx,
    Iterable<String> values, Collector<String> out) throws Exception {
    boolean repeat = false;
    for (String value : values) {
    if (value.toLowerCase().indexOf("a") > -1) {
    if (repeat) {
    continue;
    }
    repeat = true;
    }
    out.collect(value);
    }

    }
    })
    .print();
    vvtf
        2
    vvtf  
       87 天前   ❤️ 1
    if (value.toLowerCase().indexOf("a") > -1)
    这个判断是我的测试代码,
    你可以改成你的 json 方式判断.
    dtgxx
        3
    dtgxx  
    OP
       87 天前
    @vvtf 感谢大佬 感谢大佬 直接贴代码了,膜拜!!
    ihehe
        4
    ihehe  
       87 天前 via iPhone   ❤️ 1
    一楼的滚动窗口是有问题的,24 小时才触发一次
    这种简单的去重 keyby 后存个 state 就可以了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1380 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 23:58 · PVG 07:58 · LAX 15:58 · JFK 18:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.