【问题标题】:Redshift COPY command raises error if S3 prefix does not exist如果 S3 前缀不存在,Redshift COPY 命令会引发错误
【发布时间】: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 的想法对我来说看起来不错。或者根据您使用什么软件执行命令,您可能会捕获异常并忽略它。

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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2017-12-22
    相关资源
    最近更新 更多