我有一个如下所示的 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
最佳答案
将示例数据写入存储:
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")
将爆炸数组:
最后,通过数据透视,您可以得到键值对作为列:
display (dfe.groupby('id').pivot('propertyname').agg({'propertyvalue': 'first'}))
另请参阅此 Notebook 中的示例如何实现复杂数据类型的转换。
关于python - 将 json 对象列表展平到表中,并为 Databricks 中的每个对象提供列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59072170/