在Redshift加载数据到物理表时如何获取S3文件路径?
可行解决方案
方法1:COPY命令直接引入元数据列
Redshift的COPY命令原生支持$PATH和$FILENAME元数据字段,能直接将每行数据对应的S3文件完整路径或文件名写入物理表,完美解决多文件场景下的路径区分问题。
操作步骤:
- 创建包含
sourcefilename字段的物理表:
CREATE TABLE staging_table ( cola VARCHAR(255), colb INT, colc DATE, cold VARCHAR(255), sourcefilename VARCHAR(512) -- 用于存储S3文件路径 );
- 在COPY命令中指定元数据列映射:
COPY staging_table (cola, colb, colc, cold, sourcefilename) FROM 's3://your-bucket-name/path/to/files/' IAM_ROLE 'arn:aws:iam::123456789012:role/YourRedshiftRole' DELIMITER '|' IGNOREHEADER 1 REMOVEQUOTES CSV;
$PATH会自动填充当前行数据所在的完整S3文件路径(如s3://bucket/path/file1.csv)- 若只需文件名,可改用
$FILENAME,它会返回文件的基础名称(如file1.csv)
方法2:通过外部表插入物理表
既然你已经能通过外部表+视图获取S3文件路径,直接从这个视图将数据插入物理表即可,无需单独使用COPY命令处理路径:
示例:
-- 若物理表未创建,直接基于视图结构生成 CREATE TABLE target_table AS SELECT * FROM raw_view; -- 若物理表已存在,执行插入操作 INSERT INTO target_table SELECT * FROM raw_view;
这种方式复用了你已有的外部表逻辑,无需额外配置COPY参数,适合已依赖外部表进行数据预览的场景。
内容的提问来源于stack exchange,提问作者Rikesh Kayastha
相关产品推荐
相关产品推荐

