用Databricks中每个对象的列将json对象列表展平到表中

2024-06-16 09:48:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似这样的json文件

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

我能够在databricks中加载文件并对其进行解析,得到一个名为properties的列,其中包含数据中的数组。下一步是展平此列,并为数组中的每个对象获取一列,其中包含属性名称中的名称和值。在databricks中有没有什么本地的方法可以做到这一点?你知道吗

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

编辑 这就是我要找的输出。 enter image description here


Tags: 文件数据对象名称idjson属性格式
1条回答
网友
1楼 · 发布于 2024-06-16 09:48:55

将示例数据写入存储器:

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)

结果集如下所示:

enter image description here

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

将爆炸阵列:

enter image description here

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

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

enter image description here

另请参阅本文中的示例Notebook如何在复杂数据类型上实现转换。你知道吗

相关问题 更多 >