Apache spark 如何在pyspark中将分组数据存储到json中

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[{},{},{},{}] 我创建了一个数据框架(我连接两个表基本上是为了得到更多的字段) 从独家新闻中加入独家新闻

我是Pypark的新手

我有一个数据集,看起来像(只是几个列的快照)

我想按键对数据进行分组。我的钥匙是

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?