如果 S3 前缀不存在,Redshift COPY 命令会引发错误
Posted
技术标签:
【中文标题】如果 S3 前缀不存在,Redshift COPY 命令会引发错误【英文标题】:Redshift COPY command raises error if S3 prefix does not exist 【发布时间】:2018-09-20 21:00:33 【问题描述】:当我运行这个 COPY 命令时:
COPY to_my_table (field1, field2, etc)
FROM s3://my-service-f55b83j5vvkp/2018/09/03
CREDENTIALS 'aws_iam_role=...'
JSON 'auto' TIMEFORMAT 'auto';
我收到此错误:
The specified S3 prefix '2018/09/03' does not exist
这是有道理的,因为我的 S3 存储桶在该特定前缀中没有任何文件。但是,这是加载数据的日常工作的一部分,有时会加载一些内容,但有时则没有加载任何内容。
我检查了COPY documentation,它似乎没有任何方法可以避免错误,如果该前缀下没有对象,则不做任何事情。也许我错过了什么?
【问题讨论】:
使用 MAXERROR 不会改变行为,仍然会引发错误。 你能放一个虚拟文件吗? @JonScott 的想法对我来说看起来不错。或者根据您使用什么软件执行命令,您可能会捕获异常并忽略它。 【参考方案1】:我想在这里提出建议,在我们的案例中我们是如何解决这个问题的,虽然它的解决方案很简单,但可能对其他人有帮助。 Jon Scot 在我喜欢的评论中提出了不错的选择。但是,不幸的是,在我们的案例中,我们无法做到这一点,因为将文件添加到 S3 的系统不在我们的控制范围内。所以不确定它也是你的情况。 我认为您可以通过多种方式解决您的问题,但这里有两个我建议的选项。
1)由于您可能正在运行 cron 作业以将数据加载到 Redshift,因此请在执行 Copy
命令之前检查文件是否存在,如下所示。
path=s3://my-service-f55b83j5vvkp/2018/09/03
count=\`s3cmd ls $path | wc -l\`
if [[ $count -eq 1 ]]; then
//Your Redshift copy code goes here.
else
echo "Nothing to load"
fi
此选项的优点是您节省了一些成本,尽管可能完全可以忽略不计。
2) 没有记录的虚拟文件,最终不会将任何数据加载到 Redshift。
【讨论】:
以上是关于如果 S3 前缀不存在,Redshift COPY 命令会引发错误的主要内容,如果未能解决你的问题,请参考以下文章
如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?