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