PySpark如何重命名带空格等易引发报错的特殊名称列?
错误根因
你当前的报错本质是两个问题叠加:
- 你执行
data.select('fields')之后,拿到的DataFrame只有fields一个顶级列,npa_case_id ID是fields结构下的嵌套子字段,直接在顶级列查询当然找不到 - 带空格的列名需要用反引号包裹才能被PySpark正确识别,你之前的
withColumn写法也不符合语法,withColumn第二个参数必须是列对象而不是字符串
解决方案1:重命名带空格的嵌套字段
先把fields结构中的目标字段取出重命名,再根据需求调整结构即可:
from pyspark.sql import functions as F # 取出fields中所有子字段,对带空格的字段单独重命名 processed_df = data.select( "*", # 保留原顶级列,不需要可删除 F.col("fields.`npa_case_id ID`").alias("npa_case_id_ID"), # *带空格的字段必须用反引号包裹在字段名两侧* # 其他fields下需要保留的字段可按同样方式取出,比如: # F.col("fields.other_normal_col").alias("other_normal_col") ).drop("fields") # 删掉原来的旧fields结构列 # 如果需要把重命名后的字段重新组装回fields结构,可加下面这步 processed_df = processed_df.select( "*", F.struct( F.col("npa_case_id_ID"), # 其他你要放进fields结构的字段 ).alias("fields") )
解决方案2:直接删除该带空格的嵌套字段
直接过滤fields结构中的字段,排除掉目标字段即可:
from pyspark.sql import functions as F # 先获取fields下的所有子字段名 fields_cols = data.select("fields.*").columns # 过滤掉要删除的带空格字段 remaining_cols = [F.col(f"fields.`{c}`").alias(c) for c in fields_cols if c != "npa_case_id ID"] # 重新组装新的fields结构覆盖原有结构 processed_df = data.withColumn("fields", F.struct(*remaining_cols))
通用规则
所有包含特殊字符(空格、中文、特殊标点、大小写敏感场景)的列名/嵌套字段名,在PySpark中引用时都需要用反引号`包裹才能被正确解析。
内容的提问来源于stack exchange,提问作者mmz
相关产品推荐
相关产品推荐

