我有一個資料集,其中包含的欄位有:userId、event、pageName和timestamp,但缺少sessionId。我想為每條記錄創建一個基于時間戳和預定義值 "finish "的sessionId(表明在多少分鐘的非活動后,一個會話結束)。只有具有相同UserId的用戶才能在同一個會話中。
如果 "結束 "值是30分鐘(時間戳相差1800),而一個樣本資料框架是:
from pyspark.sql import functions as F
from pyspark.sql.window import Window
df = spark.createDataFrame([
("blue", "view", 1610494094750, 11) 。
("green", "add to bag", 1510593114350, 21) 。
("red", "close", 1610493115350, 41) 。
("blue"/span>, "view", 1610494094350, 11)。
("blue"/span>, "close"/span>, 1510593114312, 21)。
("red", "view", 1610493114350, 41) 。
("red", "view", 1610593114350, 41) 。
("綠色", "購買", 1610494094350, 31)
], [" item", "event", "timestamp", "userId"]
----- ---------- ------------- ------
|專案|事件|時間戳|用戶身份|
----- ---------- ------------- ------
|藍色|查看|1610494094750| 11|
|綠色|添加到袋子|1510593114350| 21|
|紅色|關閉|1610493115350| 41|
|藍色|查看|1610494094350| 11|
|藍色|關閉|1510593114312| 21|
|紅色|查看|1610493114350| 41|
|紅色|查看|1610593114350| 41|
|綠色|購買|1610494094350| 31|
----- ---------- ------------- ------
最終的結果應該是這樣的:
-------- ---------- ------------- ------ ---------
|專案|事件|時間戳|userId|sessionId|
-------- ---------- ------------- ------ ---------
|藍色|關閉|1510593114312| 21| session1||
| 綠色|添加到袋子|1510593114350| 21| session1|
| 觀察|1610493114350| 41| session2|
瀏覽器中的藍字|查看|1610494094350| 11| session3||
| 昨日下午,記者來到了位于北京的一家公司,在這里,記者看到,該公司的員工們都在忙著作業,他們的作業內容是:"我們的作業內容是什么呢?
| 綠色|購買|1610494094350| 31| session4|
| 觀察|1610494094750| 11| session3|
| 觀察|1610593114350| 41| session5|
-------- ---------- ------------- ------ ---------
我正試圖用PySpark來解決這個問題。歡迎任何建議。
編輯:我已經編輯了時間戳
uj5u.com熱心網友回復:我認為這應該可以完成作業:
我認為這應該可以完成作業。
# Get the previous timestamp for each userid
df = df.withColumn(
"session_id"。
F.lag("timestamp").over(Window.partitionBy("userid").orderBy("timestamp") 。)
)
# 定義該會話是否為第1個會話(在前一個會話之后超過1800s)。
df = df.withColumn(
"session_id"。
F.when(F.col("timestamp") - F. col("session_id") <= 1800, 0).否則(1) 。
)
# 為每個會話創建一個統一的ID(同一ID可以存在于不同的用戶)。
df = df.withColumn(
"session_id"。
F.sum("session_id").over(Window.partitionBy("userid").orderBy("timestamp") )。)
)
# 為每個用戶的每個會話創建一個統一的ID。
df = df.withColumn(
"session_id"/span>, F.dense_rank().over(Window.orderBy("userid"/span>, "session_id"/span>)
)
df.show()
----- ---------- ------------- ------ ----------
|專案|事件|時間戳|userId|session_id|
----- ---------- ------------- ------ ----------
|藍色|查看|1610494094350| 11| 1|
|藍色|查看|1610494094750| 11| 1|
|藍色|關閉|1510593114312| 21| 2|
|green|add to bag|1510593114350| 21| 2|
|綠色|購買|1610494094350| 31| 3|
|紅色|查看|1610493114350| 41| 4|
|紅色|關閉|1610493115350| 41| 4|
| 紅色|查看|1610593114350| 41| 5|
----- ---------- ------------- ------ ----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/319176.html
標籤:
