AWS RDS导出至S3的.gz.parquet文件下载报错,寻求批量处理方案
批量处理Aurora导出的.gz.parquet文件并跨区迁移方案
方案1:AWS CLI + Bash脚本批量重命名并跨区复制
适合本地执行,操作简单,适配一次性批量处理场景。
- 先递归列出源桶下所有目标文件,保存到本地清单:
aws s3 ls s3://源桶名/ --recursive | grep ".gz.parquet" > file_list.txt
- 编写循环脚本,逐个跨区复制并重命名文件:
#!/bin/bash while read -r line; do # 提取文件的S3键路径 s3_key=$(echo "$line" | awk '{print $4}') # 替换后缀:移除.gz前缀 new_key=${s3_key%.gz.parquet}.parquet # 跨区复制并重命名到目标桶 aws s3 cp s3://源桶名/$s3_key s3://目标桶名/$new_key # 可选:复制完成后删除源文件 # aws s3 rm s3://源桶名/$s3_key done < file_list.txt
- 先测试少量文件验证逻辑,确认无误后批量执行。
方案2:AWS Lambda批量处理(无服务器方式)
无需本地环境,适合大规模文件自动化处理。
用Python编写Lambda函数,遍历源桶对象并跨区复制重命名:
import boto3 s3 = boto3.client('s3') def lambda_handler(event, context): source_bucket = '源桶名' target_bucket = '目标桶名' # 分页遍历源桶所有对象 paginator = s3.get_paginator('list_objects_v2') pages = paginator.paginate(Bucket=source_bucket) for page in pages: if 'Contents' in page: for obj in page['Contents']: key = obj['Key'] if key.endswith('.gz.parquet'): # 生成新文件名 new_key = key.replace('.gz.parquet', '.parquet') # 跨区复制对象 s3.copy_object( Bucket=target_bucket, Key=new_key, CopySource={'Bucket': source_bucket, 'Key': key} ) # 可选:删除源对象 # s3.delete_object(Bucket=source_bucket, Key=key) return {'statusCode': 200, 'body': '批量处理完成'}
注意:给Lambda配置S3的ListBucket、GetObject、PutObject权限,同时根据文件数量调整超时时间(最长15分钟)。
方案3:修改Aurora导出参数,从根源避免错误后缀
下次导出时直接生成合规后缀的文件,省去后续处理步骤:
使用AWS CLI启动Aurora导出任务时,指定GZIP压缩但不额外添加.gz后缀(Parquet文件元数据会记录压缩格式,无需通过后缀标识):
aws rds start-export-task \ --export-task-id aurora-parquet-export \ --source-arn arn:aws:rds:源区域:账号ID:cluster:你的aurora集群名 \ --s3-bucket-name 源桶名 \ --iam-role-arn arn:aws:iam::账号ID:role/rds-s3-export-role \ --kms-key-id arn:aws:kms:源区域:账号ID:key/你的KMS密钥ID \ --export-only "你的数据库.你的表" \ --file-format PARQUET \ --compression-type GZIP
导出后的文件后缀为.parquet,直接支持下载和跨区复制操作。
内容的提问来源于stack exchange,提问作者svalls
相关产品推荐
相关产品推荐

