Python 将Spark df按一列分组,并将一列的结果拆分为多列-旋转和选择性合并

Python 将Spark df按一列分组,并将一列的结果拆分为多列-旋转和选择性合并,python,pandas,dataframe,apache-spark,pandas-groupby,Python,Pandas,Dataframe,Apache Spark,Pandas Groupby,我有以下几点建议: 请注意,只有在已通过运行以下命令安装spark的情况下,才能在本地运行此命令。否则,在Databricks集群上复制该问题,该集群将自动初始化spark上下文 从pyspark.sql导入SparkSession spark=SparkSession.builder.appName(“测试”).getOrCreate() sc=spark.sparkContext spark_dataframe=pd.dataframe({'id':['867','430','658','

我有以下几点建议:

请注意,只有在已通过运行以下命令安装spark的情况下,才能在本地运行此命令。否则,在Databricks集群上复制该问题,该集群将自动初始化spark上下文

从pyspark.sql导入SparkSession
spark=SparkSession.builder.appName(“测试”).getOrCreate()
sc=spark.sparkContext
spark_dataframe=pd.dataframe({'id':['867','430','658','157','521','867','430','867'],
“概率”:[0.12,0.72,0.32,0.83,0.12,0.49,0.14,0.12],
“RAG”:['G','R','A','R','G','A','G','G'],
‘时间戳’:[‘2020-07-01 17-49-32’、‘2020-07-01 17-49-32’、‘2020-07-01 17-49-32’、‘2020-07-01 17-49-32’、‘2020-07-01 17-49-32’、‘2020-07-01 16-45-32’、‘2020-07-01 15-45-32’])
spark\u dataframe=spark.createDataFrame(spark\u dataframe)
现在,我想按“id”对spark数据帧进行分组,并计算“RAG”列的值,将它们拆分为不同的列。所以,像这样做

+---+--------------------+-------------+------------+
| id||G(count)|A(count)|R(count)|Timestamp(max)     |
+---+--------------------+-------------+------------+
|867|        2|       1|       0|2020-07-01 17-49-32|
|430|        1|       0|       1|2020-07-01 17-49-32|
|658|        0|       1|       0|2020-07-01 17-49-32|
|157|        0|       0|       1|2020-07-01 17-49-32|
|521|        1|       0|       0|2020-07-01 17-49-32|
+---+--------------------+-------------+------------+
基于上面的Spark数据框,创建一个字典列表,如:

final_list=[]
map_dictionary={“R”:0.6,“A”:0.3,“G”:0.1}
final_list=[{“id”:“867”,“RAG”:“G”,“Timestamp”:“2020-07-01 17-49-32”},因为对于id 867,G列的计数比同一行上其余A,R列的值大2个。
{“id”:“430”,“RAG”:“R”,“时间戳”:“2020-07-01 17-49-32”}因为G和R有1次出现,但根据地图字典,R的权重更大,。。。
]#列表的长度等于5,因为上面五行是spark df的唯一行。

您可以对它们进行分组和旋转

import pyspark.sql.functions as F
#%%
tst = sqlContext.createDataFrame([(867,0.12,'G','2020-07-01 17-49-32'),(430,0.72,'R','2020-07-01 17-49-32'),(658,0.32,'A','2020-07-01 17-49-32'),\
                                              (157,0.83,'R','2020-07-01 17-49-32'),(521,0.12,'G','2020-07-01 17-49-32'),(867,0.49,'A','2020-07-01 16-45-32'),
                                              (430,0.14,'G','2020-07-01 16-45-32'),(867,0.12,'G','2020-07-01 16-45-32')],
                                               schema=['id','Probability','RAG','Timestamp'])
tst1 = tst.groupby('id').pivot('RAG').agg(F.count('Probability').alias('count'),F.max('Timestamp').alias('time_stamp'))
# there will be one time stamp per value of 'RAG'. The below code will find maximum among them
ts_coln = [F.col(x) for x in tst1.columns if 'time_stamp' in x]

tst2 = tst1.withColumn('max_ts',F.greatest(*ts_coln))
结果:

+---+-------+-------------------+-------+-------------------+-------+------------


最后,您可以删除不相关的列

Raghu谢谢您的回答,它工作成功并产生适当的结果。你对词典最终列表的创建有什么意见吗?很高兴听到。你能结束这个问题并把第二部分作为一个新问题发布吗?否则答案可能太长。此外,它与pyspark相比,在python方面做得更多。因此,您将从python专家那里得到更好的答案。好的,我将发布关于列表创建的第二个问题。我怀疑这更像是一个python问题而不是spark问题,因为spark df的值收集是通过spark sql函数完成的。然而,if-else语句更像是python开发的一部分,我对标题做了一个小的修改,以更好地反映问题-,希望没问题
-------+-------------------+
| id|A_count|       A_time_stamp|G_count|       G_time_stamp|R_count|       R_time_stamp|             max_ts|
+---+-------+-------------------+-------+-------------------+-------+-------------------+-------------------+
|658|      1|2020-07-01 17-49-32|      0|               null|      0|               null|2020-07-01 17-49-32|
|430|      0|               null|      1|2020-07-01 16-45-32|      1|2020-07-01 17-49-32|2020-07-01 17-49-32|
|521|      0|               null|      1|2020-07-01 17-49-32|      0|               null|2020-07-01 17-49-32|
|157|      0|               null|      0|               null|      1|2020-07-01 17-49-32|2020-07-01 17-49-32|
|867|      1|2020-07-01 16-45-32|      2|2020-07-01 17-49-32|      0|               null|2020-07-01 17-49-32|
+---+-------+-------------------+-------+-------------------+-------+-------------------+-------------------+