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。以下是一些可供考虑的方法:

  1. 使用清单文件 - 此文件将包含 S3 对象名称 加载。您的处理/文件准备可以更新此文件
  2. 使用文件所在的固定加载文件夹进行COPY,然后 COPY 后将这些文件移动到 perm 存储位置。
  3. 在你的工作台中使用变量来设置月份值并替换它 在 SQL 发布到 Redshift 时。
  4. 编写一些代码(Lambda?)来发布您正在寻找的SQL
  5. 上次我检查过你可以保留对象名称不完整和所有 将加载匹配的对象。留下批号和 后缀并用一个文本更改加载所有文件。

最好使用 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_*'

您只需要更改月份和年份标识符。具有该前缀的所有文件将被一批加载。