簡體   English   中英

如何使用 PySpark 結構化流計算時間戳之間的差異

[英]How to compute difference between timestamps with PySpark Structured Streaming

PySpark 結構化流媒體存在以下問題。

我的 stream 數據中的每一行都有一個用戶 ID 和一個時間戳。 現在,對於每一行和每個用戶,我想添加一個帶有時間戳差異的列。

例如,假設我收到的第一行是:“用戶 A,08:00:00”。 如果第二行顯示“用戶 A,08:00:10”,那么我想在第二行添加一個名為“間隔”的列,表示“10 秒”。

有誰知道如何實現這一目標? 我嘗試使用結構化流文檔的 window 函數示例,但它沒有用。

非常感謝

由於我們正在談論結構化流和“每一行和每個用戶” ,這告訴我您應該使用帶有某種流聚合( groupBygroupByKey )的流查詢。

對於流式聚合,您只能依靠結構化流中的微批處理 stream 執行。 這使得單個用戶的記錄可能是兩個不同微批次的一部分。 這表明您需要一個 state。

綜上所述,您需要有狀態的流式聚合。

有了這個,我想你想要一個Arbitrary Stateful Operations ,即KeyValueGroupedDataset.mapGroupsWithStateKeyValueGroupedDataset.flatMapGroupsWithState (見KeyValueGroupedDataset ):

許多用例需要比聚合更高級的有狀態操作。 例如,在許多用例中,您必須從事件的數據流中跟蹤會話。 為了進行這種會話化,您必須將任意類型的數據保存為 state,並在每個觸發器中使用數據 stream 事件對 state 執行任意操作。

從 Spark 2.2 開始,這可以使用操作mapGroupsWithState和更強大的操作flatMapGroupsWithState來完成。 這兩個操作都允許您在分組數據集上應用用戶定義的代碼來更新用戶定義的 state。

state 將是每個用戶找到的最后一條記錄。 這看起來可行。

我的擔憂是:

  1. 這個流式查詢要處理多少用戶? (越多狀態越大)

  2. 何時清理 state(不再期望在流中的用戶)? (這將使 state 保持合理的大小)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM