如果 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 命令会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

使用多个清单文件从 S3 加载到 Redshift?

来自空 S3 分区的 Redshift COPY

如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?

Redshift COPY 命令无法从 S3 加载数据

由于我的 csv 文件中的某些数据中存在“\”,Redshift Copy 命令失败

来自 S3 的 AWS Redshift COPY csv