Python Pyskark Dataframe:将行中的唯一元素转换为列
我有一个Pyspark数据帧,格式如下: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 | +---
+------------+---------+
| 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不可编辑
。有什么想法吗?我已经问了一个更详细的问题