我正在尝试使用copy
命令将数据从S3存储桶复制到Redshift。
当我在复制命令中传递确切的文件名时它工作得很好但是当我在我的from子句中使用通配符(*
)时会抛出错误 - “指定的S3前缀'suiteX *'不存在;“
我的所有文件都遵循此命名惯例 - SuiteX_Date_Hour.csv
例如 - SuiteX-20150101-1.csv
这是我的复制命令:
copy mytable from 's3://mybucket/suiteX_20150101_1.csv'
CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=XXXX'
delimiter ',' REGION AS 'us-east-1';
以下是无效的复制命令:
copy mytable from 's3://mybucket/suiteX*'
CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=XXXX'
delimiter ',' REGION AS 'us-east-1';
在从S3复制数据时,怎么能让copy命令与通配符一起使用?
答案 0 :(得分:5)
redshift COPY命令没有显式通配符语法。您提供的对象路径被视为前缀,任何匹配对象将被复制。如果对象路径与多个文件夹匹配,则所有中的所有对象将被复制。
您应该能够通过以下方式让它适用于您的示例:
s3://mybucket/suiteX' CREDENTIALS 'aws_access_key_id=XXXXX;aws_secret_access_key=XXXX' delimiter ',' REGION AS 'us-east-1';
COPY from Amazon S3文档中的相关部分说:
FROM' s:// copy_from_s3_objectpath'
指定包含数据的Amazon S3对象的路径,例如' s3://mybucket/cust.txt'。 s3:// copy_from_s3_objectpath参数可以引用具有相同键前缀的单个文件或一组对象或文件夹。例如,名称custdata.txt是一个引用许多物理文件的键前缀:custdata.txt.1,custdata.txt.2,依此类推。键前缀也可以引用许多文件夹。例如,' s3:// mybucket / custfolder'指的是文件夹custfolder_1,custfolder_2等。如果键前缀引用多个文件夹,则将加载文件夹中的所有文件。
答案 1 :(得分:3)
根据Redshift docs,我不认为COPY命令支持s3文件源路径的通配符。相反,您可以按如下方式指定存储桶目录。
copy data
from 's3://mybucket/data/'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
在这种情况下,data/
目录下的文件将被复制到Redshift。