首页 > 解决方案 > Pyspark使用json对象读取json,其中包含json列表,在转换为数据帧时会更改一些格式

问题描述

我有以下 json 对象列表:

[
  {
    "AccountId": "xxxx",
    "ResourceId": "yyyy",
    "ProductName": "zzzz",
    "Tags": [{"Name": "John Doe"}, {"Environment":"DEV"}]
  },
  {
    "AccountId": "aaaa",
    "ResourceId": "bbbb",
    "ProductName": "cccc",
    "Tags": [{"Name": "Jane Doe"}, {"Environment":"DEV"}]
  },
  {
    "AccountId": "iiii",
    "ResourceId": "jjjj",
    "ProductName": "kkkk",
    "Tags": [{"Environment":"QA"}]
  }
]

我尝试使用这种方式将其变成数据框:

ss = SparkSession.builder.appName("PythonSpark2").getOrCreate()
sc = ss.sparkContext

jsonList = someFunctionToCreate()
jsonDf = ss.read.json(sc.parallelize(jsonList))
jsonDf.show(truncate=False)

最终结果会弄乱“标签”列。数组内的 json 对象列表将被拆分为具有 json 值的数组的数组。

|---------------------|------------------|---------------------|---------------------|
|      AccountId      |     ResourceId   |     ProductName     |         Tags        |
|---------------------|------------------|---------------------|---------------------|
|        xxxx         |       yyyy       |        zzzz         | [[JohnDoe,],[,DEV]] |
|---------------------|------------------|---------------------|---------------------|
|        aaaa         |       bbbb       |        cccc         | [[JaneDoe,],[,DEV]] |
|---------------------|------------------|---------------------|---------------------|
|        iiii         |       jjjj       |        kkkk         |     [[,],[,QA]]     |
|---------------------|------------------|---------------------|---------------------|

我有办法防止这种情况吗?还是我为 json 使用了错误的结构?

标签: pythonjsonpysparknested

解决方案


有一个函数只是将列转换为 json, to_json.

df = spark.read.option("header","true").option("inferSchema","true").json("test.json")
df.show(truncate=False)

df.withColumn('Tags', to_json('Tags')).show(truncate=False)

+---------+-----------+----------+-------------------------------------------+
|AccountId|ProductName|ResourceId|Tags                                       |
+---------+-----------+----------+-------------------------------------------+
|xxxx     |zzzz       |yyyy      |[{"Name":"John Doe"},{"Environment":"DEV"}]|
|aaaa     |cccc       |bbbb      |[{"Name":"Jane Doe"},{"Environment":"DEV"}]|
|iiii     |kkkk       |jjjj      |[{"Environment":"QA"}]                     |
+---------+-----------+----------+-------------------------------------------+

推荐阅读