AWS S3:如何在 COPY 命令中的 S3 目录中插入动态文件名
AWS S3: How to plug in a dynamic file name in the S3 directory in COPY command
我在 Redshift 有一份工作,负责每月从 S3 中提取 6 个文件。文件名遵循标准命名约定,如“file_label_MonthNameYYYY_Batch01.CSV”。我想修改下面的 COPY 命令以动态更改 S3 目录中的文件命名,这样我就不必对月份名称和 YYYY 以及批号进行硬编码。批号范围1-6.
目前,这是我所拥有的效率不高的:
COPY tbl_name ( column_name1, column_name2, column_name3 )
FROM 'S3://bucket_name/folder_name/Static_File_Label_July2021_Batch01.CSV'
CREDENTIALS 'aws_access_key_id = xxx;aws_secret_access_key = xxxxx'
removequotes
EMPTYASNULL
BLANKSASNULL
DATEFORMAT 'MM/DD/YYYY'
delimiter ','
IGNOREHEADER 1;
COPY tbl_name ( column_name1, column_name2, column_name3 )
FROM 'S3://bucket_name/folder_name/Static_File_Label_July2021_Batch02.CSV'
CREDENTIALS 'aws_access_key_id = xxx;aws_secret_access_key = xxxxx'
removequotes
EMPTYASNULL
BLANKSASNULL
DATEFORMAT 'MM/DD/YYYY'
delimiter ','
IGNOREHEADER 1;
动态文件名下个月改为August2021_Batch01 & August2021_Batch02等。有没有办法做到这一点?提前谢谢你。
有很多方法可以解决这个问题。哪一个最适合您的情况取决于您的情况。您的流程中需要一个层来控制每个月的配置 SQL。以下是一些可供考虑的方法:
- 使用清单文件 - 此文件将包含 S3 对象名称
加载。您的处理/文件准备可以更新此文件
- 使用文件所在的固定加载文件夹进行COPY,然后
COPY 后将这些文件移动到 perm 存储位置。
- 在你的工作台中使用变量来设置月份值并替换它
在 SQL 发布到 Redshift 时。
- 编写一些代码(Lambda?)来发布您正在寻找的SQL
- 上次我检查过你可以保留对象名称不完整和所有
将加载匹配的对象。留下批号和
后缀并用一个文本更改加载所有文件。
最好使用 COPY 命令加载多个文件(并行使用更多节点),选项 1、2 和 5 执行此操作。
指定要加载的文件的 FROM
位置时,您可以指定 部分文件名。
这是来自 COPY examples - Amazon Redshift 的示例:
The following example loads the SALES table with tab-delimited data from lzop-compressed files in an Amazon EMR cluster. COPY loads every file in the myoutput/
folder that begins with part-
.
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
因此,您可以指定:
FROM 'S3://bucket_name/folder_name/Static_File_Label_July2021_*'
您只需要更改月份和年份标识符。具有该前缀的所有文件将被一批加载。
我在 Redshift 有一份工作,负责每月从 S3 中提取 6 个文件。文件名遵循标准命名约定,如“file_label_MonthNameYYYY_Batch01.CSV”。我想修改下面的 COPY 命令以动态更改 S3 目录中的文件命名,这样我就不必对月份名称和 YYYY 以及批号进行硬编码。批号范围1-6.
目前,这是我所拥有的效率不高的:
COPY tbl_name ( column_name1, column_name2, column_name3 )
FROM 'S3://bucket_name/folder_name/Static_File_Label_July2021_Batch01.CSV'
CREDENTIALS 'aws_access_key_id = xxx;aws_secret_access_key = xxxxx'
removequotes
EMPTYASNULL
BLANKSASNULL
DATEFORMAT 'MM/DD/YYYY'
delimiter ','
IGNOREHEADER 1;
COPY tbl_name ( column_name1, column_name2, column_name3 )
FROM 'S3://bucket_name/folder_name/Static_File_Label_July2021_Batch02.CSV'
CREDENTIALS 'aws_access_key_id = xxx;aws_secret_access_key = xxxxx'
removequotes
EMPTYASNULL
BLANKSASNULL
DATEFORMAT 'MM/DD/YYYY'
delimiter ','
IGNOREHEADER 1;
动态文件名下个月改为August2021_Batch01 & August2021_Batch02等。有没有办法做到这一点?提前谢谢你。
有很多方法可以解决这个问题。哪一个最适合您的情况取决于您的情况。您的流程中需要一个层来控制每个月的配置 SQL。以下是一些可供考虑的方法:
- 使用清单文件 - 此文件将包含 S3 对象名称 加载。您的处理/文件准备可以更新此文件
- 使用文件所在的固定加载文件夹进行COPY,然后 COPY 后将这些文件移动到 perm 存储位置。
- 在你的工作台中使用变量来设置月份值并替换它 在 SQL 发布到 Redshift 时。
- 编写一些代码(Lambda?)来发布您正在寻找的SQL
- 上次我检查过你可以保留对象名称不完整和所有 将加载匹配的对象。留下批号和 后缀并用一个文本更改加载所有文件。
最好使用 COPY 命令加载多个文件(并行使用更多节点),选项 1、2 和 5 执行此操作。
指定要加载的文件的 FROM
位置时,您可以指定 部分文件名。
这是来自 COPY examples - Amazon Redshift 的示例:
The following example loads the SALES table with tab-delimited data from lzop-compressed files in an Amazon EMR cluster. COPY loads every file in the
myoutput/
folder that begins withpart-
.
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
因此,您可以指定:
FROM 'S3://bucket_name/folder_name/Static_File_Label_July2021_*'
您只需要更改月份和年份标识符。具有该前缀的所有文件将被一批加载。