PySpark RDD-将秩转换为JSON
我有一个配置单元查询,它返回如下数据:PySpark RDD-将秩转换为JSON,json,apache-spark,pyspark,apache-spark-sql,Json,Apache Spark,Pyspark,Apache Spark Sql,我有一个配置单元查询,它返回如下数据: Date,Name,Score1,Score2,Avg_Score 1/1/2018,A,10,20,15 1/1/2018,B,20,20,20 1/1/2018,C,15,10,12.5 1/1/2018,D,11,12,11.5 1/1/2018,E,21,29,25 1/1/2018,F,10,21,15.5 我使用hive_context.sqlmy_query.rdd将其放入rdd。 我的最终目标是将其转换为JSON格式,并根据Avg_分数进
Date,Name,Score1,Score2,Avg_Score
1/1/2018,A,10,20,15
1/1/2018,B,20,20,20
1/1/2018,C,15,10,12.5
1/1/2018,D,11,12,11.5
1/1/2018,E,21,29,25
1/1/2018,F,10,21,15.5
我使用hive_context.sqlmy_query.rdd将其放入rdd。
我的最终目标是将其转换为JSON格式,并根据Avg_分数进行降序,如下所示:
Scores=
[
{
"Date": '1/1/2018',
"Name": 'A',
"Avg_Score": 15,
"Rank":4
},
{
"Date": '1/1/2018',
"Name": 'B',
"Avg_Score": 20,
"Rank":2
}
]
作为获得等级的第一步,我尝试实现,但一直遇到类似AttributeError的错误:“RDD”对象没有属性“withColumn”
我如何才能做到这一点?这是因为您的工作是在RDD级别。如果您想使用DataFrameAPI,就必须使用Dataset或Dataframe。正如“给您的评论”问题中提到的,您可以删除.rdd转换并使用asDict获得最终结果
df = sc.parallelize([
("1/1/2018","A",10,20,15.0),
("1/1/2018","B",20,20,20.0),
("1/1/2018","C",15,10,12.5),
("1/1/2018","D",11,12,11.5),
("1/1/2018","E",21,29,25.0),
("1/1/2018","F",10,21,15.5)]).toDF(["Date","Name","Score1","Score2","Avg_Score"])
from pyspark.sql import Window
import pyspark.sql.functions as psf
w = Window.orderBy(psf.desc("Avg_Score"))
rddDict = (df
.withColumn("rank",psf.dense_rank().over(w))
.drop("Score1","Score2")
.rdd
.map(lambda row: row.asDict()))
结果
>>> rddDict.take(1)
[{'Date': u'1/1/2018', 'Avg_Score': 25, 'Name': u'E', 'rank': 1}]
但是,请注意使用不带分区的窗口函数时出现的警告:
18/08/13 11:44:32 WARN window.WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
您是否尝试过不转换为rdd并在DataFrame上操作,而Column是DataFramefunction@pault不确定我是否理解您的问题-我已经让RDDTry df=hive\u context.sqlmy\u查询删除了.rdt当您将数据帧转换为dict的RDD时,即使没有专门解决订单保存问题,这篇文章是一篇有趣且部分相关的文章