AWS Glue读取含空格列名的表报错,求解决方案
AWS Glue处理带空格列名的DataFrame问题
问题场景
执行Spark SQL读取Glue Catalog表:
spark.sql(""" Select * from `DB`.table_name""")
生成的DataFrame包含带空格的列名(如supervisor id),任何操作都会抛出错误:
AnalysisException: Attribute name "supervisor id" contains invalid character(s) among " ,;{}()\t=". Please use alias to rename it.
已尝试的无效方案:
- SELECT语句显式别名重命名,
df.columns显示列名已修改,但执行操作仍报错 - 使用
.withColumnRenamed方法 - 循环遍历列名替换空格为下划线的批量重命名代码
可行解决方案
方案1:通过Glue DynamicFrame读取并重命名(推荐)
利用Glue的DynamicFrame在读取阶段直接修改列名,避开Spark懒加载导致的分析错误:
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) # 从Glue Catalog读取为DynamicFrame dynamic_frame = glueContext.create_dynamic_frame.from_catalog( database="DB", table_name="table_name" ) # 批量重命名带空格的列 renamed_mapping = [ (col.name, col.name.replace(' ', '_')) for col in dynamic_frame.schema.fields if ' ' in col.name ] renamed_dynamic_frame = dynamic_frame.rename_fields(renamed_mapping) # 转换为Spark DataFrame df = renamed_dynamic_frame.toDF()
方案2:显式编写SQL列名别名(需全量列名)
不使用SELECT *,而是逐个列出列并给带空格的列加反引号和别名:
df = spark.sql(""" SELECT `supervisor id` AS supervisor_id, `employee name` AS employee_name, department, -- 无空格的列可直接保留 -- 其他列依次列出 FROM `DB`.table_name """)
注意:不要混合使用SELECT *和显式列别名,避免列重复导致的问题。
方案3:临时允许带空格列名(应急用)
通过Spark配置放宽列名校验,操作时需用反引号包裹带空格的列名:
# 设置配置 spark.conf.set("spark.sql.parser.quotedRegexColumnNames", "true") spark.conf.set("spark.sql.caseSensitive", "true") # 操作示例 df.select(`supervisor id`).show()
该方案仅适合临时调试,长期建议重命名列名以避免后续问题。
内容的提问来源于stack exchange,提问作者Elissaios
相关产品推荐
相关产品推荐

