AWS Glue迁移S3到Snowflake时pyWriteDynamicFrame列不存在报错排查
问题排查与解决方案
1 核心根因:列名大小写不匹配
报错信息中已经明确提示:Spark侧的Schema列名为全大写的SERIAL_NUMBER,但JDBC写入Sink尝试匹配的是小写的serial_number,二者不一致触发报错。
Snowflake默认对未加双引号的标识符自动转为全大写存储,而AWS Glue从S3读取CSV/JSON等格式数据时,默认保留原始文件的小写列名,两边大小写规则冲突是该类问题的高发原因。
解决方法:
- 写入前统一转换DynamicFrame列名为全大写,参考PySpark代码:
from awsglue.dynamicframe import DynamicFrame # 转换为Spark DataFrame处理列名 df = original_dynamic_frame.toDF() df_uppercase_cols = df.toDF(*[c.upper() for c in df.columns]) # 转回DynamicFrame用于后续写入 processed_dynamic_frame = DynamicFrame.fromDF(df_uppercase_cols, glueContext, "processed_dyf")
- 也可在Snowflake连接器的额外配置项中添加
quoted_identifiers_ignore_case=true,关闭大小写校验规则。
2 版本兼容性确认
你当前使用的连接器与JDBC驱动版本组合无兼容性问题,但需要确认Glue作业版本匹配:
你使用的Snowflake Spark连接器适配Spark 2.3版本,因此Glue作业版本需选择Glue 2.0(对应Spark 2.4.x,向下兼容Spark 2.3),不可选择Glue 3.0及以上版本(对应Spark 3.x,不兼容2.x系列连接器)。
3 其他遗漏配置排查
- 确认Snowflake目标表的
SERIAL_NUMBER列真实存在,且列数据类型与Spark Schema中的DoubleType匹配,若表中该列为字符串类型也会触发匹配失败 - 确认连接器配置中指定的Snowflake Schema、Database名称正确,避免误操作到其他库表导致列不存在
- 若开启了自动建表功能,需确认目标库中没有提前创建过列名为小写
serial_number的同名表
内容的提问来源于stack exchange,提问作者Lavish Patodi
相关产品推荐
相关产品推荐

