繁体   English   中英

如何为 Flink DataStream 执行简单的中值算法(最好在 Java 和 Flink 1.14 中)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM