Redshift数据卸载至S3分区时,如何避免分区列名出现在文件夹名称中
解决Redshift UNLOAD到S3时分区文件夹名称不带key的问题
这个需求我之前刚好碰到过,其实Redshift的UNLOAD命令里有个专门的参数可以轻松搞定!
默认情况下,当你用PARTITION BY (dt)进行分区时,Redshift会采用KEY_VALUE的分区格式,也就是生成dt=2020-01-01/这样的文件夹。要改成只保留分区值的格式,只需要添加PARTITION_FORMAT 'VALUES'参数就行。
具体示例对比
- 默认分区命令(生成key=value格式):
UNLOAD ('SELECT col1, col2 FROM your_target_table') TO 's3://your-bucket-name/your-base-path/' IAM_ROLE 'arn:aws:iam::123456789012:role/your-redshift-iam-role' PARTITION BY (dt) FORMAT AS PARQUET;
执行后会生成类似s3://your-bucket-name/your-base-path/dt=2020-01-01/的文件夹结构。
- 修改后的命令(仅保留分区值):
UNLOAD ('SELECT col1, col2 FROM your_target_table') TO 's3://your-bucket-name/your-base-path/' IAM_ROLE 'arn:aws:iam::123456789012:role/your-redshift-iam-role' PARTITION BY (dt) PARTITION_FORMAT 'VALUES' -- 关键就是这个参数 FORMAT AS PARQUET;
这样执行后,就会生成s3://your-bucket-name/your-base-path/2020-01-01/的文件夹结构,完全符合你的需求。
注意事项
- 确保你的Redshift集群版本支持
PARTITION_FORMAT参数,一般2021年及以后的版本都已经包含这个功能,如果是较老的集群可能需要先升级版本。 - 分区列的类型会影响生成的文件夹名称格式,比如你的
dt是DATE类型,就会自动生成yyyy-mm-dd格式的字符串作为文件夹名,不需要额外转换。
内容的提问来源于stack exchange,提问作者marcia12




