如果S3前缀不存在,Redshift COPY命令将引发错误

时间:2018-09-20 21:00:34

标签: amazon-web-services amazon-s3 amazon-redshift

当我运行此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,似乎没有什么办法可以避免该错误,并且如果该前缀下没有对象,则什么也不做。也许我缺少什么?

1 个答案:

答案 0 :(得分: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加载任何数据。