Apache spark 如何在pyspark中将分组数据存储到json中
我是Pypark的新手 我有一个数据集,看起来像(只是几个列的快照) 我想按键对数据进行分组。我的钥匙是Apache spark 如何在pyspark中将分组数据存储到json中,apache-spark,dataframe,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,Pyspark Sql,我是Pypark的新手 我有一个数据集,看起来像(只是几个列的快照) 我想按键对数据进行分组。我的钥匙是 CONCAT(a.div_nbr,a.cust_nbr) 我的最终目标是将数据转换成JSON,格式如下 k1[{v1,v2,....},{v1,v2,....}], k2[{v1,v2,....},{v1,v2,....}],.... e、 g 1384611034793[{},{},{},{}] 我创建了一个数据框架(我连接两个表基本上是为了得到更多的字段) 从独家新闻中加入独家新闻
CONCAT(a.div_nbr,a.cust_nbr)
我的最终目标是将数据转换成JSON,格式如下
k1[{v1,v2,....},{v1,v2,....}], k2[{v1,v2,....},{v1,v2,....}],....
e、 g
1384611034793[{},{},{},{}]
我创建了一个数据框架(我连接两个表基本上是为了得到更多的字段)
从独家新闻中加入独家新闻(a.precima\U id=b.precima\U id)“)
现在,为了得到上面的结果,我需要根据基于键的结果进行分组,我做了以下工作
groupbydf = joinstmt.groupBy("key")
这导致intp是一个分组数据,在阅读之后,我知道我不能直接使用它,我需要将它转换回数据帧来存储它
我是新手,需要一些帮助才能将其转换回数据帧,或者如果还有其他方法,我将不胜感激。您不能直接使用
GroupedData
。必须首先对其进行聚合。可以使用内置函数(如collect\u list
对其进行聚合,但这是不可能的能够使用DataFrameWriter
实现所需的输出,使用值表示键
在中,您可以尝试以下方式:
from pyspark.sql import Row
import json
def make_json(kvs):
k, vs = kvs
return json.dumps({k[0]: list(vs)})
(df.select(struct(*keys), values)
.rdd
.mapValues(Row.asDict)
.groupByKey()
.map(make_json))
和
saveAsTextFile
如果加入的数据帧如下所示:
gender age
M 5
F 50
M 10
M 10
F 10
然后,您可以使用下面的代码来获得所需的输出
joinedDF.groupBy("gender") \
.agg(collect_list("age").alias("ages")) \
.write.json("jsonOutput.txt")
输出如下所示:
{"gender":"F","ages":[50,10]}
{"gender":"M","ages":[5,10,10]}
df.groupBy("gender")
.agg(collect_list("age").alias("ages"),collect_list("name").alias("names"))
如果您有多个列,如姓名、薪资。您可以添加以下列:
{"gender":"F","ages":[50,10]}
{"gender":"M","ages":[5,10,10]}
df.groupBy("gender")
.agg(collect_list("age").alias("ages"),collect_list("name").alias("names"))
您的输出如下所示:
{"gender":"F","ages":[50,10],"names":["ankit","abhay"]}
{"gender":"M","ages":[5,10,10],"names":["snchit","mohit","rohit"]}
澄清问题:OP示例中的变量“kvs”、“*keys”和“values”对应什么?谢谢——根据OP的问题,我们如何将您的解决方案扩展到包含更多字段的数据?例如,如果joinedDF包含[{'SEXT':'M','name':'kelly',age':20},{'SEXT SEXT M','name':'bob',age':41}],然后按“性别”分组:{“性别”:“M”,“姓名”:[kelly”,“bob'],“年龄”:[20,41]}更新了我的答案。希望这会有所帮助。但是收集的列表项目是否有序?例如,在您的示例中,50岁对应ankit,10岁对应abhay?