Redshift STL_LOAD_ERRORS列长度不符求助:Merge加载失败Truncate后正常
问题分析与解决方案
核心原因推测
- Glue Merge的schema推断偏差
Glue在Merge模式下,可能未正确读取Redshift主表的实际DDL,而是基于历史元数据或数据样本,错误推断reason列长度为256,加载时用这个错误限制校验数据。 - Glue Data Catalog元数据未同步
若该列最初定义为varchar(256),后续修改为12000但未同步到Glue的Data Catalog,Merge操作会沿用旧的元数据规则。 - Merge临时表列定义错误
Glue Merge过程中创建的临时中间表,reason列被错误设置为256长度,导致数据写入临时表时触发截断报错,最终合并主表失败。
可行解决方案
- 强制指定schema,禁用自动推断
在Glue作业中手动定义表结构,确保reason列匹配Redshift的实际长度:from pyspark.sql.types import StructType, StructField, StringType sales_schema = StructType([ # 按需添加其他列定义 StructField("reason", StringType(), nullable=True) # 部分场景可精确指定:StructField("reason", StringType(12000), nullable=True) ]) # 读取源数据时绑定自定义schema source_df = spark.read.schema(sales_schema).format("csv").load("s3://your-source-path") - 同步Glue Data Catalog元数据
- 登录Glue控制台,找到
sales表 - 进入「编辑表」页面,将
reason列的类型更新为varchar(12000) - 保存后重新运行Merge作业
- 登录Glue控制台,找到
- 验证Redshift表的实际属性
执行Redshift SQL确认列定义是否生效:
确保返回的SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = 'sales' AND column_name = 'reason';character_maximum_length值为12000,排除DDL变更未落地的情况。 - 检查Merge临时表配置
若Glue使用临时表处理增量逻辑,需显式指定临时表的列定义与主表一致,避免自动创建时出现属性偏差。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

