使用COPY功能自动将数据加载到Redshift中

时间:2019-03-20 14:04:41

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

Amazon Redshift文档指出,将数据加载到数据库中的最佳方法是使用COPY函数。如何每天自动将数据文件上传到S3来运行它?

更长的版本:我已经启动了Redshift集群并设置了数据库。我创建了一个S3存储桶并上传了CSV文件。现在,从Redshift查询编辑器中,我可以轻松地手动运行COPY函数。我该如何自动化?

2 个答案:

答案 0 :(得分:0)

您可以在存储桶上创建一个外部表。 Redshift会自动扫描存储桶中的所有文件。但是请记住,查询的性能可能不如通过COPY加载的数据那样好,但是您获得的好处是不需要调度程序。

此外,一旦有了外部表,您就可以一次加载它以使用单个CREATE TABLE AS SELECT ... FROM your_external_table进行红移。这种方法的优势在于它是幂等的-您无需跟踪文件-它将始终从存储桶中的所有文件中加载所有数据。

答案 1 :(得分:0)

在确定方法之前,您应该考虑以下要点:

  1. 如果可能,将csv文件压缩为gzip,然后提取到相应的redshift表中。这样可以减小文件大小,并提高整体数据提取性能。

  2. 最终确定表列上的压缩方案。如果您希望redshift完成这项工作,可以在复制命令中使用“ COMPUPDATE ON”启用自动压缩。请参阅aws文档

现在,回答您的问题:

您已经为S3存储桶创建了S3存储桶,因此请为每个表创建目录并将文件放置在其中。如果输入文件很大,请将它们分成多个文件(应根据您拥有的节点数选择文件数,以实现更好的并行摄取,请参阅aws doc了解更多详细信息)。

您的复制命令应如下所示:

Option Explicit
Sub Formatting()

    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If Not ws.Name = "LookUp" Then 'the sheet with the lookup name
            'your formatting code
        End If
    Next ws    

End Sub

下一步,创建lambda并在redshift s3存储桶上启用sns,一旦您在s3存储桶中收到新文件,此sns应触发lambda。另一种方法是将cloudwatch调度程序设置为运行lambda。

可以创建Lambda(java / python或任何lang)来读取s3文件,连接到redshift并使用复制命令将文件摄取到表中。

Lambda有15分钟的限制,如果您对此感到担忧,那么Fargate会更好。在EC2上运行作业将比lambda或fargate产生更多的账单(以防您忘记关闭ec2机器)