PySpark嵌套JSON含点字段重命名及Schema定义问题
解决PySpark中嵌套字段重命名与Schema字符串匹配问题
一、重命名嵌套结构体中的group.assignment_group字段
字段名里的圆点会被PySpark解析为层级分隔符,直接操作会报错。可以通过重新构造外层的result结构体,保留原有字段的同时将带点字段重命名:
from pyspark.sql import functions as F # 重新构造result结构体,替换带点字段名 df_renamed = df.withColumn( "result", F.struct( F.col("result.approver").alias("approver"), F.col("result.comments").alias("comments"), F.col("result.document_id").alias("document_id"), # 用反引号包裹完整字段路径,避免圆点被解析为层级 F.col("`result.group.assignment_group`").alias("group_assignment_group"), F.col("result.source_table").alias("source_table"), F.col("result.state").alias("state"), F.col("result.sys_created_on").alias("sys_created_on"), F.col("result.sys_updated_on").alias("sys_updated_on") ) ) # 验证修改后的Schema df_renamed.printSchema()
二、正确构造匹配现有Schema的字符串格式
你之前的str_schema存在格式错误且不完整,PySpark的结构体Schema字符串需遵循struct<字段名:类型, ...>的格式,嵌套结构体直接嵌套struct<...>即可。以下是匹配原Schema和重命名后Schema的完整字符串:
匹配原Schema的字符串(包含带点字段)
str_schema_original = """ struct< approver:struct<display_value:string,link:string>, comments:string, document_id:struct<display_value:string,link:string>, `group.assignment_group`:struct<display_value:string,link:string>, source_table:string, state:string, sys_created_on:string, sys_updated_on:string > """
匹配重命名后Schema的字符串
str_schema_renamed = """ struct< approver:struct<display_value:string,link:string>, comments:string, document_id:struct<display_value:string,link:string>, group_assignment_group:struct<display_value:string,link:string>, source_table:string, state:string, sys_created_on:string, sys_updated_on:string > """
使用示例
假设你的array_field是存储result结构体的数组字段,转换时直接传入正确的Schema字符串即可:
df.select(F.col("array_field").cast(str_schema_original)).printSchema()
内容的提问来源于stack exchange,提问作者Piccinin1992
相关产品推荐
相关产品推荐

