![](/img/trans.png)
[英]How to perform average operation on DataStream in Apache Flink using Java
[英]How do I perform a simple median algorithm for a Flink DataStream (preferably in Java and Flink 1.14)?
我在 Flink 中有一个看起来像这样的消息数据流:( (Name, Place, Number, Time)
我想跟踪每个键的中位数。
让事情变得更复杂一些......
假设我有消息: (Jonah, Mars, 1, 1:00)
(Jonah, Mars, 2, 1:01)
(Jonah, Moon, 3, 1:02)
(Jonah, Earth, 4, 1:03)
我想仅使用每个地方的最新消息来取中值,即仅使用: (Jonah, Mars, 2, 1:01)
(Jonah, Moon, 3, 1:02)
(Jonah, Earth, 4, 1:03)
这里的答案是3
(Jonah, Mars, 1, 1:00)
不包括在内,因为(Jonah, Mars, 1, 1:01)
是最近的
我的假设是它看起来像:
inputStream
.keyBy(message -> message.name)
.window(SlidingEventTimeWindows.of(30,1))
.<MEDIAN FUNCTION>
我猜答案会利用MapState
,虽然我不知道如何使用窗口化MapState
...
注意:这是一个类似的问题。 这里的建议是不要这样做....不幸的是,我需要一个中位数:(
一种解决方案是使用KeyedProcessFunction
,其中键是名称。 然后在键控状态下,您可以保留从位置映射到该位置(对于该名称)的最新事件的MapState
。
然后,当您想产生结果时,您将不得不走地图。
这有点痛苦,但我没有更好的主意。 如果您对性能敏感,需要大规模使用它,并且不需要确切的答案,则可以改用 t-digest 草图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.