我如何执行一个简单的中位数算法的Flink数据流(最好在Java和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)

我想取一个中值,只使用每个位置最近的消息,即使用just:(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草图来代替。

相关内容

  • 没有找到相关文章

最新更新