python - 将 json 对象列表展平到表中,并为 Databricks 中的每个对象提供列

标签 python json databricks

我有一个如下所示的 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

最佳答案

将示例数据写入存储:

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

最后,通过数据透视,您可以得到键值对作为列:

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

enter image description here

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

关于python - 将 json 对象列表展平到表中,并为 Databricks 中的每个对象提供列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59072170/

相关文章:

java - 为什么 GSON 在我所有原本不包含任何小数的 JSON 数字之后都加上一个小数点和一个零?

javascript - 使用 Polymer 的 core-ajax 加载所有 json 文件后执行方法

用于安装 Datadog 的 Databricks 初始化脚本不起作用

python - Python 中的 __set__ 和 __setattr__ 有什么区别,应该在什么时候使用?

python - 有没有一种方法可以在 Python 中对 JSON 文件中的单个属性的键值求和?

json - Scala/Play : modify Json. 单个字段的格式宏行为

azure - Databricks-connect 测试 : TypeError: expected str, 字节或 os.PathLike 对象,而不是 NoneType

python - 为什么 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

python - 为什么Python属性不设置属性值

python - databricks Rest api 奇怪的缺少参数