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

Posted

技术标签:

【中文标题】使用 COPY 功能自动将数据加载到 Redshift【英文标题】:Automatically load data into Redshift with the COPY function 【发布时间】:2019-03-20 14:04:41 【问题描述】:

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

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

【问题讨论】:

你有几个选择!最简单的方法是设置一个 cron 作业在每天某个时间在 ec2 实例上运行,该 cron 作业将使用 psql 运行您的复制命令 谢谢,我会研究 psql。 您可以编写一个 lambda 函数,每次在存储桶中上传文件时,触发器都会运行它。这是几行代码,我使用python和boto3来解决这种情况 Lambda 可以,但 15 分钟后会超时。 @MiloBellano 我在哪里编写这些 Lambda 函数? 【参考方案1】:

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

    如果可能,将 csv 文件压缩成 gzip,然后摄取到相应的红移表中。这将大大减少您的文件大小,并提高整体数据摄取性能。

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

现在,回答你的问题:

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

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

PGPASSWORD=<password> psql -h <host> -d <dbname> -p 5439 -U <username> -c "copy <table_name> from 's3://<bucket>/<table_dir_path>/'     credentials 'aws_iam_role=<iam role identifier to ingest s3 files into redshift>' delimiter ',' region '<region>' GZIP COMPUPDATE ON REMOVEQUOTES IGNOREHEADER 1"

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

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

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

【讨论】:

【参考方案2】:

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

此外,一旦您有一个外部表,您可以使用单个 CREATE TABLE AS SELECT ... FROM your_external_table 将其加载一次以进行红移。这种方法的好处是它是幂等的——你不需要跟踪你的文件——它总是会从存储桶中的所有文件中加载所有数据。

【讨论】:

以上是关于使用 COPY 功能自动将数据加载到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

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

错误:加载到表中 - COPY 命令中的数据无效

Redshift COPY 并自动创建表?

使用 COPY 命令将数据从 JSON 文件复制到 Redshift

如何在 Copy commd 中使用反斜杠字符将 s3 csv gz 文件加载到 Redshift

GreenPlum数据加载