我有一个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草图来代替。