我有一个这样的数据框
data =
我想对“ nm”进行分组操作,并尝试实现如下所示的json结构
我写了一段代码,该代码在某些方面起作用
import json
from pyspark.sql.types import *
from pyspark.sql import functions as F,SparkSession
def js():
def func(row):
temp=row.asDict()
headDict = {}
headDict['record'] = "record"
headDict['name'] = temp["nm"]
headDict['grp'] =temp['payload1']
return (json.dumps(headDict,default=str))
return F.udf(func,StringType())
def js1():
def func(row):
temp=row.asDict()
headDict = {}
headDict['type'] = temp["nm"]
smalldict={}
smalldict['id'] = temp["id"]
smalldict['txt'] = temp["txt"]
headDict['val'] = smalldict
return (json.dumps(headDict,default=str))
return F.udf(func,StringType())
if __name__ == "__main__":
spark = SparkSession.builder.master("local[*]").appName("PythonWordCount").getOrCreate()
data = spark.createDataFrame([(1, "a", 'foo1'),(2, "b", 'bar'),(3, "a", 'mnc'),(4, "b", 'mnc')],
['id', 'nm', 'txt']
)
data = data.withColumn("payload1", js1()(struct([data[x] for x in data.columns])))
data1=data.groupBy("nm").agg(*[F.collect_list("payload1").alias("payload1")])
data2 = data1.withColumn("payload2", js()(struct([data1[x] for x in data1.columns])))
data2.select("payload2").show(2,False)
在使用slash(“”)部分时,我可以通过替换轻松地将其删除,但是将其转换为有效的json文件时遇到了麻烦。这是因为json(突出显示的部分)中使用了双引号。>
1>是否有更好的方法可以实现而不使用2个udfs
2>如何为此要求获取合适的json。