使用aws_s3.table_import_from_s3从S3导入CSV至Postgres RDS时文本列触发NumericValueOutOfRange错误的咨询
这问题我之前碰到过好几次,核心原因是CSV文件的列顺序和你的Postgres表列顺序不匹配,导致数据错位了!
错误原因拆解
你的test表列顺序是:id(integer,自增)→ Company_Phone_Number(text)→ Created_Date(date)→ Violation_Date(date)。但你的CSV里第一列是电话号码7343154608,当你调用aws_s3.table_import_from_s3时没有指定列映射关系,Postgres会默认按表的列顺序去读取CSV的每一列——也就是说,它把CSV第一列的电话号码当成了id列的值!
而Postgres的integer类型最大值是2147483647,7343154608远大于这个值,所以就抛出了NumericValueOutOfRange错误,错误信息里提到的column id也印证了这一点。
解决方案
方案1:导入时显式指定列映射(推荐)
在调用导入函数时,通过columns参数明确告诉Postgres CSV的列对应到表的哪些列。比如你的CSV列顺序是Company_Phone_Number, Created_Date, Violation_Date(因为id是自增serial,不需要从CSV导入),可以这么写:
SELECT aws_s3.table_import_from_s3( 'test', -- 目标表名 'Company_Phone_Number, Created_Date, Violation_Date', -- 表的列,对应CSV的列顺序 '(FORMAT csv, HEADER true)', -- 如果CSV有表头,一定要加HEADER true跳过表头行 'your-s3-bucket-name', -- 替换成你的S3桶名 'path/to/your/file.csv', -- 替换成CSV文件的S3路径 'your-aws-region' -- 替换成你的AWS区域,比如us-east-1 );
方案2:调整CSV的列顺序
如果不想修改导入语句,可以把CSV的列顺序调整成和表完全一致:id, Company_Phone_Number, Created_Date, Violation_Date。不过因为id是自增类型,CSV里这一列可以留空或者直接省略(但还是推荐用方案1,避免后续表结构变更时再次出问题)。
验证步骤
你可以先打开CSV文件看前几行,确认列顺序是不是和表的列顺序对不上——这几乎肯定是问题的根源。
内容的提问来源于stack exchange,提问作者mbeeman

