利用Spark SQL視窗函數辨識基於複雜時間條件的使用者活動週期
Spark SQL的視窗函數提供了一種強大的機制,用於在指定時間範圍或分區內的一組行上執行計算。一個常見的應用是根據特定條件決定使用者活動週期的開始時間。
定義視窗
為此,我們定義兩個視窗:
user_name
分區,並依login_date
排序。 user_name
和稍後確定的session
分區。 辨識新會話的開始
決定新會話何時開始的關鍵是比較連續行的登入日期。如果兩個連續登入日期之間的差異大於5天,則辨識出一個新會話。我們使用以下程式碼捕捉這一點:
<code class="language-scala">val newSession = (coalesce( datediff($"login_date", lag($"login_date", 1).over(userWindow)), lit(0) ) > 5).cast("bigint")</code>
分配會話ID
現在,我們可以透過對userWindow
上的newSession
值求和來為每一行分配一個會話ID:
<code class="language-scala">val sessionized = df.withColumn("session", sum(newSession).over(userWindow))</code>
確定活躍日期
最後,我們透過在每個userSessionWindow
內尋找最小login_date
來確定每個會話的became_active
日期:
<code class="language-scala">val result = sessionized .withColumn("became_active", min($"login_date").over(userSessionWindow)) .drop("session")</code>
範例
使用提供的範例資料:
<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")</code>
結果將是:
<code>+----------------+----------+-------------+ | user_name|login_date|became_active| +----------------+----------+-------------+ | OprahWinfreyJr|2012-01-10| 2012-01-10| |SirChillingtonIV|2012-01-04| 2012-01-04| |SirChillingtonIV|2012-01-11| 2012-01-11| |SirChillingtonIV|2012-01-14| 2012-01-11| |SirChillingtonIV|2012-08-11| 2012-08-11| |Booooooo99900098|2012-01-04| 2012-01-04| |Booooooo99900098|2012-01-06| 2012-01-04| +----------------+----------+-------------+</code>
這示範如何在Spark SQL中使用視窗函數來有效地確定時間資料的複雜條件。
以上是Spark SQL視窗函數如何根據複雜的時間條件識別使用者活動週期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!