使用清单文件从多文件夹S3桶加载Parquet至Redshift失败求助
问题分析与解决方案
核心问题
- 清单文件不支持通配符:Redshift的manifest文件中,
url字段无法识别*通配符,必须指定具体文件路径或使用前缀匹配(前缀匹配需直接在COPY命令中配置,而非清单内),当前写法会导致Redshift无法解析通配符对应的文件。 - 冗余参数干扰解析:
FORMAT AS PARQUET已明确文件格式,PARQUET是自描述列存格式,不需要额外指定delimiter ',',该参数会干扰Redshift的文件解析逻辑。
解决步骤
步骤1:修正COPY命令
删除无效的delimiter ','参数,修正后命令如下:
copy dimproduct -- target table from 's3://redshift-load-queue/manifest.txt' -- source path iam_role 'arn:aws:iam::XXXX' region 'us-west-2' FORMAT AS PARQUET;
步骤2:修复清单文件(或改用无清单写法)
选项A:生成包含所有文件的完整清单
用AWS CLI批量生成每个文件的条目,再组合成合法的manifest文件:
- 生成单个文件夹的文件条目(以folder1为例):
aws s3 ls s3://redshift-load-queue/folder1/ --recursive | grep ".parquet" | awk '{print "{\"url\":\"s3://redshift-load-queue/"$4"\", \"mandatory\":true}"}' > folder1_entries.txt
- 对folder2、folder3、folder4重复上述命令,生成各自的条目文件。
- 合并所有条目,整理成完整的manifest.json:
{ "entries": [ // 粘贴folder1_entries.txt的内容,条目间用逗号分隔 // 粘贴folder2_entries.txt的内容 // 粘贴folder3_entries.txt的内容 // 粘贴folder4_entries.txt的内容 ] }
注意:最后一个条目后不能保留多余逗号。
选项B:直接使用COPY命令的多前缀匹配(无需清单)
如果不需要强制验证文件存在(即mandatory: true的需求),可直接在COPY命令中指定多个文件夹前缀,无需使用manifest文件:
copy dimproduct from 's3://redshift-load-queue/folder1/', 's3://redshift-load-queue/folder2/', 's3://redshift-load-queue/folder3/', 's3://redshift-load-queue/folder4/' iam_role 'arn:aws:iam::XXXX' region 'us-west-2' FORMAT AS PARQUET;
步骤3:验证IAM权限
确保Redshift使用的IAM角色拥有以下权限:
s3:GetObject:针对s3://redshift-load-queue/*s3:ListBucket:针对s3://redshift-load-queue
可通过检查角色的策略文档确认权限配置是否正确。
内容的提问来源于stack exchange,提问作者Angel D'souza
相关产品推荐
相关产品推荐

