在 PySpark 中创建第二个会话列
Create column of second sessions in PySpark
在给定以下数据框的情况下,创建显示第二个会话的列的最有效方法是什么:
from pyspark import SparkContext
from pyspark.sql import HiveContext, Window
from pyspark.sql import functions as F
sc = SparkContext("local")
sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame([
("u1", "g1", 0),
("u2", "g2", 1),
("u1", "g2", 2),
("u1", "g3", 3),
], ["UserID", "GameID", "Time"])
df.show()
+------+------+----+
|UserID|GameID|Time|
+------+------+----+
| u1| g1| 0|
| u2| g2| 1|
| u1| g2| 2|
| u1| g3| 3|
+------+------+----+
期望输出
我也想保留第一场比赛的时间作为专栏。
+------+------+-----+-----+
|UserID|MinTim|Game1|Game2|
+------+------+-----+-----+
| u1| 0| g1| g2|
| u1| 2| g2| g3|
+------+------+-----+-----+
我曾考虑在 UserID 上使用 window 分区,然后使用 rowsBetween(0, 1) 但遇到了问题。
使用 Spark 1.6 但对 2.0 解决方案开放。
w = Window().partitionBy("UserID").orderBy(F.col("Time"))
(df
.select("UserID",
"Time",
F.col("GameID").alias("Game1"),
F.lead("GameID").over(w).alias("Game2"))
.na.drop(subset="Game2")
).show()
+------+----+-----+-----+
|UserID|Time|Game1|Game2|
+------+----+-----+-----+
| u1| 0| g1| g2|
| u1| 2| g2| g3|
+------+----+-----+-----+
在给定以下数据框的情况下,创建显示第二个会话的列的最有效方法是什么:
from pyspark import SparkContext
from pyspark.sql import HiveContext, Window
from pyspark.sql import functions as F
sc = SparkContext("local")
sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame([
("u1", "g1", 0),
("u2", "g2", 1),
("u1", "g2", 2),
("u1", "g3", 3),
], ["UserID", "GameID", "Time"])
df.show()
+------+------+----+
|UserID|GameID|Time|
+------+------+----+
| u1| g1| 0|
| u2| g2| 1|
| u1| g2| 2|
| u1| g3| 3|
+------+------+----+
期望输出
我也想保留第一场比赛的时间作为专栏。
+------+------+-----+-----+
|UserID|MinTim|Game1|Game2|
+------+------+-----+-----+
| u1| 0| g1| g2|
| u1| 2| g2| g3|
+------+------+-----+-----+
我曾考虑在 UserID 上使用 window 分区,然后使用 rowsBetween(0, 1) 但遇到了问题。
使用 Spark 1.6 但对 2.0 解决方案开放。
w = Window().partitionBy("UserID").orderBy(F.col("Time"))
(df
.select("UserID",
"Time",
F.col("GameID").alias("Game1"),
F.lead("GameID").over(w).alias("Game2"))
.na.drop(subset="Game2")
).show()
+------+----+-----+-----+
|UserID|Time|Game1|Game2|
+------+----+-----+-----+
| u1| 0| g1| g2|
| u1| 2| g2| g3|
+------+----+-----+-----+