如何解决如何合并多个Keyed Streams,然后对合并的Streams执行自定义聚合函数
我的问题的上下文如下:
我有一些输入流:DataStream <String> input_stream= . . .
首先,我执行一个 flatMap 操作,以便将输入流填充/复制到 3 个具有 3 个不同标识符的相同实例。
structured_stream = input_stream.flatMap(new FlatMapFunction<String,Tuple2<String,Integer>>
结果为 Tuple2<String,Integer>
字符串 | 整数 |
---|---|
输入流 | 1 |
输入流 | 2 |
输入流 | 3 |
所以,中间结果是输入流旁边的不同标识符
然后通过对第二个属性的keyBy操作...
需要澄清的是,我们从 DataStream 环境转到了 KeyedStream 环境
KeyedStream<Tuple2<Integer,Integer>> partial_result = structured_stream.keyBy(1).flatMap(new StatefulMap());
我实现了一个函数 StatefulMap,它本质上是每个键的状态。
static class StatefulMap extends RichFlatMapFunction<Tuple2<String,Integer>,...> {}
每个 State 给我一个输出(通过收集器),其中包含关于给定 input_stream 的答案。
所以,我有三个部分结果。
整数 | 字符串 | 整数(状态标识符) |
---|---|---|
答案 1 | 输入流 | 状态 1 |
答案2 | 输入流 | 状态 2 |
答案 3 | 输入流 | 状态 3 |
我的问题是:
有什么办法可以从 3 个不同的 KeyedStreams 中收集所有这些部分结果,并制作一个通用的自定义聚合/累加器,例如 WeightedVoting(提取一个最终结果)? (不是基于键而是基于 input_stream)
也就是说有没有办法在Apache Flink中合并多个KeyedStreams并执行单个聚合功能?
附言我当前的解决方案是将每个 KeyedStream 写入同一个 Apache Kafka 接收器,然后运行第二个作业,根据输入数据流执行我的自定义聚合功能。从本质上讲,我将 KeyedStreams 转换为一个统一的 DataStream 但我添加了第二项工作,即开销。
对于那些想知道我正在 Apache Flink 中实现集成学习的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。