从Aurora导出大几何数据至Redshift的高效方案咨询
问题描述
需要将Aurora PostgreSQL中包含大几何数据列的表迁移至Redshift,采用CSV导出+Copy命令的常规方案时,大几何数据会被拆分为多行导致加载失败。已尝试以下操作但未解决:
- 修改CSV分隔符(逗号、|、制表符),仍出现拆分
- 改用JSON格式,但Redshift不支持JSON加载几何数据
- 转换为EWKT格式后导出CSV,依旧拆分
- 导出为文本格式,文件体积暴涨至1.9G(原70M)
- 用Python导出DataFrame:字符数<32767的几何数据正常,>32767的无法在CSV中正常存储,EWKT格式也超字符限制
需求:不考虑联邦查询,提供跨VPC、跨账号的快速小量空间数据迁移方案(POC需求,优先速度)
快速解决方案
方案1:Aurora原生COPY导出带引号包裹的CSV(最快速POC)
步骤1:Aurora端导出数据
直接用PostgreSQL原生COPY命令导出,强制用双引号包裹所有字段,彻底避免换行拆分:
COPY ( SELECT id, ST_AsEWKT(geometry_column) AS geometry_ewkt FROM your_target_table ) TO '/tmp/aurora_export.csv' WITH ( FORMAT CSV, HEADER, QUOTE '"', ESCAPE '"', DELIMITER '|' );
步骤2:上传至跨账号S3
将导出文件上传到双方账号都能访问的S3桶:
- 给S3桶添加跨账号权限,允许Redshift所在账号的IAM角色读取
- 跨VPC场景可通过S3 VPC端点访问,POC阶段可临时开启S3公网访问(测试后关闭)
步骤3:Redshift端加载数据
用COPY命令加载,匹配导出时的参数:
COPY redshift_target_table (id, geometry_column) FROM 's3://your-cross-account-bucket/aurora_export.csv' IAM_ROLE 'arn:aws:iam::[redshift-account-id]:role/your-redshift-role' FORMAT CSV HEADER DELIMITER '|' QUOTE '"' ESCAPE '"';
优势:无需额外工具,原生命令严格控制格式,Redshift能正确识别大字段,全程耗时短。
方案2:Base64编码二进制几何数据(适合超大规模几何)
步骤1:Aurora端导出Base64编码的WKB数据
将几何数据转为WKB二进制后用Base64编码,避免传输问题:
COPY ( SELECT id, encode(ST_AsBinary(geometry_column), 'base64') AS geometry_wkb_base64 FROM your_target_table ) TO '/tmp/aurora_wkb_export.txt' WITH ( FORMAT TEXT, DELIMITER '\t' );
步骤2:上传至S3
同方案1的上传配置。
步骤3:Redshift端加载并转换
先加载编码后的数据,再解码转为几何类型:
-- 加载数据 COPY redshift_target_table (id, geometry_wkb_base64) FROM 's3://your-cross-account-bucket/aurora_wkb_export.txt' IAM_ROLE 'arn:aws:iam::[redshift-account-id]:role/your-redshift-role' FORMAT TEXT DELIMITER '\t'; -- 转换为Redshift几何字段 UPDATE redshift_target_table SET geometry_column = ST_GeomFromWKB(decode(geometry_wkb_base64, 'base64')); -- 可选:删除临时编码列 ALTER TABLE redshift_target_table DROP COLUMN geometry_wkb_base64;
优势:比EWKT体积小,适合超大几何数据,避免字符数限制问题。
内容的提问来源于stack exchange,提问作者Joann Ren
相关产品推荐
相关产品推荐

