AWS Glue Job向Redshift写入数据出现Null值问题咨询
Glue写入Redshift部分字段为空排查方案
- 第一步:校验字段类型匹配性
首先对比Glue Data Catalog表的字段类型与Redshift目标表的字段类型:- 注意数值类字段的精度兼容问题:比如样例中
coin24hrVol字段部分文件为整数、部分为带.0的浮点数,若Crawler采样不全识别为bigint,或Redshift表字段类型为精度不足的INT,超出上限/类型不兼容时会直接转为Null,需统一设置为DOUBLE或足够精度的NUMERIC类型 - 注意时间类字段格式匹配:
fetchTime带微秒后缀、rankDate为日期字符串,若Redshift目标字段类型与Glue输出的字符串格式不兼容,也会触发转换失败返回Null - 注意字段名大小写匹配:Redshift默认将字段名转为小写,若Glue表字段保留驼峰命名未做映射,会出现字段匹配不上写入Null的问题
- 注意数值类字段的精度兼容问题:比如样例中
- 第二步:定位问题发生阶段
在Glue ETL脚本中新增日志输出逻辑,打印读取到的DynamicFrame前20条记录到CloudWatch日志:- 若日志中已经出现空值,说明问题出在数据读取阶段,需重新检查Crawler的分类器配置、Glue表字段定义
- 若日志中数据正常,说明问题出在写入Redshift阶段,继续排查写入逻辑
- 第三步:检查Glue写入Redshift的配置
Glue写入Redshift底层默认采用「先导出临时文件到S3、再执行COPY命令导入」的逻辑,需确认:- 写入时是否指定了正确的格式参数,是否未开启JSON格式解析导致字段错位
- 可在Glue任务运行日志中提取生成的COPY命令,单独在Redshift控制台执行,查看是否有显性报错
- 第四步:显式做字段类型转换
若字段存在混合类型的情况,可在Glue脚本中使用ResolveChoice算子统一转换字段类型,示例代码如下:
也可以将所有字段名统一转为小写,和Redshift字段对齐,避免映射错误。from awsglue.transforms import ResolveChoice resolved_dyf = ResolveChoice.apply( frame=source_dyf, choice="cast:double", paths=["coin24hrVol", "coinPrice", "coinMarketCap"] # 替换为出现空值的数值字段 )
内容的提问来源于stack exchange,提问作者Princewill Ezeidei
相关产品推荐
相关产品推荐

