我有用戶遊戲會話,其中包含:用戶ID,遊戲ID,分數和遊戲進行時的時間戳。從後續項目中總結第一個分組的項目
from pyspark import SparkContext
from pyspark.sql import HiveContext
from pyspark.sql import functions as F
sc = SparkContext("local")
sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame([
("u1", "g1", 10, 0),
("u1", "g3", 2, 2),
("u1", "g3", 5, 3),
("u1", "g4", 5, 4),
("u2", "g2", 1, 1),
], ["UserID", "GameID", "Score", "Time"])
所需的輸出
+------+-------------+-------------+
|UserID|MaxScoreGame1|MaxScoreGame2|
+------+-------------+-------------+
| u1| 10| 5|
| u2| 1| null|
+------+-------------+-------------+
我要變換的數據,我得到的第一場比賽的用戶播放以及第二場比賽的最高分的最高分(獎金如果我也可以獲得所有後續遊戲的最高分數)。不幸的是,我不確定用Spark SQL可以做什麼。
我知道我可以通過UserID,GameID進行分組,然後通過agg來獲得最高分和最短時間。不知道如何從那裏繼續。
說明:請注意MaxScoreGame1和MaxScoreGame2是指第一個和第二個遊戲用戶播放器;不是GameID。
另外,如果你想看到兩個以上的遊戲在輸出就是不過濾和樞軸將其餘的工作補充。 – Blakey
窗口和row_number做了訣竅。我將在PySpark中發佈我的解決方案,它有點不同。你可以驗證你的代碼是否適合演出,所以我可以給你答案? – ksindi
剛剛更新輸出,也注意到我實際上使用select而不是groupBy在數據透視表上,這是行不通的。根據你的帖子(「u1」,「g3」,2,2),(「u1」,「u1」),對於你如何得到5作爲用戶1的第二遊戲得分,假設原始數據框中存在拼寫錯誤「g3」,5,3), – Blakey