問題:
一個 DataFrame 包含使用者登入網站的記錄。需要確定使用者何時活躍,並考慮一個活動週期。如果用戶在此週期後再次登錄,則其活躍日期將重設。
提出的方法:
使用具有滯後和遞歸的視窗函數,識別活動週期內的第一次登入或最近一次登錄,以確定活躍日期。
Spark 原生解(>= 3.2):
Spark 3.2 及更高版本支援會話視窗。請參閱官方文件以了解使用方法範例。
舊版解(Spark
導入函數:
Window
用來定義視窗coalesce
, datediff
, lag
, lit
, min
, sum
定義視窗:
userWindow
按 user_name
分區,並依 login_date
排序userSessionWindow
依 user_name
和 session
分割區找出新會話的開始:
datediff
和 lag
來比較登入日期,並檢查是否有大於活動週期的差距。 cast
將結果轉換為 bigint
。 userWindow
上的 sum
來累積新的會話開始。 找出每個會話的最早日期:
withColumn
新增 session
欄位。 userSessionWindow
上的 min
來找出每個會話的最早 login_date
。 session
欄位。 範例:
<code class="language-scala"> val df = Seq( ("SirChillingtonIV", "2012-01-04"), ("Booooooo99900098", "2012-01-04"), ("Booooooo99900098", "2012-01-06"), ("OprahWinfreyJr", "2012-01-10"), ("SirChillingtonIV", "2012-01-11"), ("SirChillingtonIV", "2012-01-14"), ("SirChillingtonIV", "2012-08-11") ).toDF("user_name", "login_date") val result = sessionized //sessionized is assumed to be defined elsewhere, this is a crucial part missing from the original .withColumn("became_active", min($"login_date").over(userSessionWindow)) .drop("session") df.show(5) result.show(5)</code>
請注意,範例程式碼中缺少 sessionized
的定義,這是完成此解決方案的關鍵部分。 需要根據活動週期和登入日期計算 session
列。 這通常需要一個自訂函數或更複雜的視窗函數邏輯。 完整的解決方案需要補充這部分缺少的程式碼。
以上是如何使用視窗函數確定 Spark SQL 中的使用者活動日期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!