Python 在pyspark中将不同事件的计数结果拆分为不同的列
我有一个rdd,需要从中提取多个事件的计数。最初的rdd如下所示Python 在pyspark中将不同事件的计数结果拆分为不同的列,python,pyspark,apache-spark-sql,pyspark-sql,pyspark-dataframes,Python,Pyspark,Apache Spark Sql,Pyspark Sql,Pyspark Dataframes,我有一个rdd,需要从中提取多个事件的计数。最初的rdd如下所示 +----------+--------------------+-------------------+ | event| user| day| +----------+--------------------+-------------------+ |event_x |user_A | 0| |
+----------+--------------------+-------------------+
| event| user| day|
+----------+--------------------+-------------------+
|event_x |user_A | 0|
|event_y |user_A | 2|
|event_x |user_B | 2|
|event_y |user_B | 1|
|event_x |user_A | 0|
|event_x |user_B | 1|
|event_y |user_B | 2|
|event_y |user_A | 1|
+----------+--------------------+-------------------+
我需要为每种类型的事件(在本例中为两种类型的事件:事件x和事件y)设置一个计数列,按玩家和日期分组。到目前为止,我仅通过一个事件成功地实现了这一点,结果如下:
+--------------------+-------------------+------------+
| user| day|count(event)|
+--------------------+-------------------+------------+
|user_A | 0| 11|
|user_A | 1| 8|
|user_A | 2| 4|
|user_B | 0| 2|
|user_B | 1| 1|
|user_B | 2| 25|
+--------------------+-------------------+------------+
但我需要任意多个列,列数与上面显示的第一个rdd最左边的列中出现的事件数相同。所以,如果我只有两个事件(x和y),它应该是这样的:
+--------------------+-------------------+--------------+--------------+
| user| day|count(event_x)|count(event_y)|
+--------------------+-------------------+--------------+--------------+
|user_A | 0| 11| 3|
|user_A | 1| 8| 23|
|user_A | 2| 4| 2|
|user_B | 0| 2| 0|
|user_B | 1| 1| 1|
|user_B | 2| 25| 11|
+--------------------+-------------------+--------------+--------------+
我目前拥有的代码是:
rdd = rdd.groupby('user', 'day').agg({'event': 'count'}).orderBy('user', 'day')
我应该怎么做才能达到预期的结果
提前感谢;) 您可以尝试使用pivot选项分组
df =spark.createDataFrame([["event_x","user_A",0],["event_y","user_A",2],["event_x","user_B",2],["event_y","user_B",1],["event_x","user_A",0],["event_x","user_B",1],["event_y","user_B",2],["event_y","user_A",1]],["event","user","day"])
>>> df.show()
+-------+------+---+
| event| user|day|
+-------+------+---+
|event_x|user_A| 0|
|event_y|user_A| 2|
|event_x|user_B| 2|
|event_y|user_B| 1|
|event_x|user_A| 0|
|event_x|user_B| 1|
|event_y|user_B| 2|
|event_y|user_A| 1|
+-------+------+---+
>>> df.groupBy(["user","day"]).pivot("event").agg({"event":"count"}).show()
+------+---+-------+-------+
| user|day|event_x|event_y|
+------+---+-------+-------+
|user_A| 0| 2| null|
|user_B| 1| 1| 1|
|user_A| 2| null| 1|
|user_A| 1| null| 1|
|user_B| 2| 1| 1|
+------+---+-------+-------+
请看一看,如果您对此有任何疑问,一定要告诉我。做
rdd.groupby('user','day','event').count().orderBy('user','day')
对您有用吗?你可以先从这个开始,然后再从枢轴开始。谢谢你的回答,你的答案和马赫什说的很相似。它有效=)