flink 去重问题请教

2022-08-31 11:39:07 +08:00
 dtgxx
请教大家一个问题,flink 实时处理 kafka 的 json 数据,比如数据结构里面的 key 有 a 、b 、c ,我需要对 a 相同的所有数据去重,然后输出 a 、b 、c ,例如:
① {"a":"1","b":"2","c":"3"} ② {"a":"1","b":"222","c":"333"} 就会认为 ① 和 ② 是重复数据,最终只会输出 ①,只要当天的数据可以这样去重就可以。 在 flink 如何实现这个需求呢?麻烦大佬详细说说。
759 次点击
所在节点    问与答
4 条回复
vvtf
2022-08-31 14:16:50 +08:00
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
2022-08-31 14:18:16 +08:00
if (value.toLowerCase().indexOf("a") > -1)
这个判断是我的测试代码,
你可以改成你的 json 方式判断.
dtgxx
2022-08-31 14:22:21 +08:00
@vvtf 感谢大佬 感谢大佬 直接贴代码了,膜拜!!
ihehe
2022-08-31 14:52:10 +08:00
一楼的滚动窗口是有问题的,24 小时才触发一次
这种简单的去重 keyby 后存个 state 就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876675

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX