簡體   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