将 json 个对象的列表展平为 table,Databricks 中每个对象都有一列

Flatten list of json objects into table with column for each object in Databricks

我有一个 json 文件,看起来像这样

[
{"id": 1, 
"properties":[{"propertyname":"propertyone",
              "propertyvalye": 5},
              "propertyname":"properttwo",
              "propertyvalye": 7}]},
{"id": 2, 
"properties":[{"propertyname":"propertyone",
              "propertyvalye": 3},
              "propertyname":"properttwo",
              "propertyvalye": 8}]}]

我能够在数据块中加载文件并解析它,得到一个名为属性的列,其中包含数据中的数组。下一步是展平此列,并为数组中的每个对象获取一列,名称来自 属性 名称和值。有没有在数据块中执行此操作的本地方法?

我过去使用过的大多数 json 结构都是 {name:value} 格式,这种格式很容易解析,但我正在处理的格式让我有些头疼。 有什么建议么?我更愿意使用内置功能,但如果在 python 中有一种方法,我也可以编写一个 UDF

编辑 这是我正在寻找的输出。

将示例数据写入存储:

data = """
{"id": 1, "properties":[{"propertyname":"propertyone","propertyvalue": 5},{"propertyname":"propertytwo","propertyvalue": 7}]},
{"id": 2, "properties":[{"propertyname":"propertyone","propertyvalue": 3}, 
{"propertyname":"propertytwo","propertyvalue": 8}]}
 """

dbutils.fs.put(inputpath + "/x.json", data, True)

读取json数据:

df = spark.read.format("json").load(inputpath)

结果集如下所示:

    dfe = df.select("id", explode("properties").alias("p")) \
        .select("id", "p.propertyname", "p.propertyvalue")

会爆阵:

最后使用 pivot,您将键值对作为列:

display (dfe.groupby('id').pivot('propertyname').agg({'propertyvalue': 'first'}))

另请参阅此 Notebook 如何对复杂数据类型实施转换的示例。