将 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 如何对复杂数据类型实施转换的示例。
我有一个 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 如何对复杂数据类型实施转换的示例。