You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:50:02