如何在Databricks PySpark写入JSON时避免Struct列名作为根键
解决PySpark写入JSON时移除Struct列根键的问题
你设置的header=false对JSON格式完全无效——这个参数只针对CSV格式控制表头是否输出,所以不管怎么设置都不会影响JSON里的Struct层级。
要移除根层级的Struct列名,核心是把Struct列的字段直接提取为DataFrame的顶级列,而不是保留整个Struct对象,具体操作如下:
- 确认你的Struct列名称(比如示例里的
struct_col_name)以及它包含的子字段 - 使用
select方法展开Struct列的所有子字段:# 情况1:DataFrame仅包含这个Struct列 df_flattened = Df.select("struct_col_name.*") # 情况2:DataFrame还有其他普通列(比如id列),一并保留 # df_flattened = Df.select("id", "struct_col_name.*") - 用展开后的DataFrame写入JSON:
df_flattened.mode("overwrite").json(path)
这样生成的JSON就会直接输出Struct内部的键值对,不再包含外层的struct_col_name根键,比如从{"struct_col_name":{"actual_struct_data_col":"values"}}变成{"actual_struct_data_col":"values"}。
如果你的DataFrame有多个根层级Struct列,或者存在嵌套更深的Struct结构,也可以用同样的思路逐层展开字段;复杂场景下也可以编写递归函数实现全量扁平化,但对于你描述的单一根层级Struct的需求,上面的方法就足够解决问题。
内容的提问来源于stack exchange,提问作者Dinesh Vashisth
相关产品推荐
相关产品推荐

