从pyspark数据框创建有效的json

时间:2020-10-28 18:20:42

标签: json python-2.7 pyspark pyspark-dataframes

我有一个这样的数据框

data =

enter image description here

我想对“ nm”进行分组操作,并尝试实现如下所示的json结构

enter image description here

我写了一段代码,该代码在某些方面起作用

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)

我面临的问题是在运行代码时,我得到一个像 enter image description here

在使用slash(“”)部分时,我可以通过替换轻松地将其删除,但是将其转换为有效的json文件时遇到了麻烦。这是因为json(突出显示的部分)中使用了双引号。

1>是否有更好的方法可以实现而不使用2个udfs

2>如何为此要求获取合适的json。

0 个答案:

没有答案