Redshift Spectrum字段返回Null无报错,如何强制触发错误?
解决Redshift Spectrum超精度字段返回Null而非报错的问题
1. 修正外部表格式配置(针对带引号的数值)
如果S3文件中数值字段带双引号(如示例中的"98.7400000"),需确保外部表定义中正确配置QUOTE参数——未配置的话,Redshift会将带引号的字符串视为无效数值,直接返回Null而非尝试四舍五入。
修改或创建外部表时添加QUOTE配置:
ALTER EXTERNAL TABLE your_external_table ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' -- 根据实际分隔符调整 QUOTE '"' STORED AS TEXTFILE;
2. 强制关闭数据清洗并启用严格错误检查
表级设置
确保外部表的data_cleansing_enabled属性设置为false,关闭自动清洗无效数据的功能:
ALTER EXTERNAL TABLE your_external_table SET data_cleansing_enabled = false;
验证设置是否生效:
SELECT tablename, parameters FROM SVV_EXTERNAL_TABLES WHERE tablename = 'your_external_table';
需确认返回的parameters中包含"data_cleansing_enabled":false。
会话级参数设置
执行查询前,设置会话级的spectrum_query_maxerror为0,确保任何数据转换错误都会终止查询并返回错误:
SET spectrum_query_maxerror = 0;
同时可开启全局严格类型检查,增强类型匹配的严谨性:
SET strict_type_checking = true;
3. 验证效果
执行查询测试:
SELECT numberfield FROM your_external_table LIMIT 1;
此时若S3中存在超精度数值(如98.7400000对应decimal(18,3)),应触发报错而非返回Null;配置正确时,符合精度的数值会自动四舍五入(如98.7400000转为98.740)。
补充排查点
- 若日志表仍无记录,检查是否使用
SELECT *或字段别名导致未触发类型转换,尝试直接指定字段查询。 - 确认S3文件编码为UTF-8,避免特殊字符干扰解析。
内容的提问来源于stack exchange,提问作者RSHAP
相关产品推荐
相关产品推荐

