Python Pyskark Dataframe:将行中的唯一元素转换为列

Python Pyskark Dataframe:将行中的唯一元素转换为列,python,apache-spark,dataframe,pyspark,apache-spark-sql,Python,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,我有一个Pyspark数据帧,格式如下: +------------+---------+ | date | query | +------------+---------+ | 2011-08-11 | Query 1 | | 2011-08-11 | Query 1 | | 2011-08-11 | Query 2 | | 2011-08-12 | Query 3 | | 2011-08-12 | Query 3 | | 2011-08-13 | Query 1 | +---

我有一个Pyspark数据帧,格式如下:

+------------+---------+
|    date    |  query  |
+------------+---------+
| 2011-08-11 | Query 1 |
| 2011-08-11 | Query 1 |
| 2011-08-11 | Query 2 |
| 2011-08-12 | Query 3 |
| 2011-08-12 | Query 3 |
| 2011-08-13 | Query 1 |
+------------+---------+
我需要对其进行转换,将每个唯一查询转换为一列,按日期分组,并在数据框的行中插入每个查询的计数。我希望输出如下:

+------------+---------+---------+---------+
|    date    | Query 1 | Query 2 | Query 3 |
+------------+---------+---------+---------+
| 2011-08-11 |       2 |       1 |       0 |
| 2011-08-12 |       0 |       0 |       2 |
| 2011-08-13 |       1 |       0 |       0 |
+------------+---------+---------+---------+
我试图用它作为例子,但我不太理解代码,尤其是
make_row
函数中的
return
语句

在转换数据帧时,是否有方法计算查询数? 也许像

import pyspark.sql.functions as func

grouped = (df
    .map(lambda row: (row.date, (row.query, func.count(row.query)))) # Just an example. Not sure how to do this.
    .groupByKey())
它是一个可能包含数十万行和查询的数据帧,因此我更喜欢RDD版本,而不是使用
.collect()


谢谢大家!

您可以使用
groupBy.pivot
count
作为聚合函数:

from pyspark.sql.functions import count
df.groupBy('date').pivot('query').agg(count('query')).na.fill(0).orderBy('date').show()

+--------------------+-------+-------+-------+
|                date|Query 1|Query 2|Query 3|
+--------------------+-------+-------+-------+
|2011-08-11 00:00:...|      2|      1|      0|
|2011-08-12 00:00:...|      0|      0|      2|
|2011-08-13 00:00:...|      1|      0|      0|
+--------------------+-------+-------+-------+

我正在努力用这种格式的数据帧执行一些操作。如何使用此命令创建此数据帧,但要以转置的方式?(即标题作为日期(时间戳),每个查询作为新行?我尝试了
querys\u df=df.groupBy('query').pivot('query\u time').agg(count('query')).na.fill(0)
,但我无法获得“x轴”上的日期。),作为标题。对我有效;如果您的意思是日期格式不正确,可能需要首先将日期转换为字符串。
df.withColumn(“日期”,date\u格式(“日期”,“YYYY-MM-dd”))。groupBy('query')。pivot('date')。agg(count('query'))。na.fill(0)
并从pyspark.sql.functions导入
导入日期\格式
哦,对不起!你说得对!再次感谢:)最后一个跟进问题。。。现在,我尝试对除第一列之外的所有列求和,并将结果添加到DataFrame中的一个新列中
import pyspark.sql.函数为F
,然后
newDF=querys\u-df.withColumn('my\u-sum',F.sum(在querys\u-df.columns[1:])。show()
但这会给我
类型错误:Column不可编辑
。有什么想法吗?我已经问了一个更详细的问题