Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用复制功能自动将数据加载到红移_Amazon Web Services_Amazon S3_Amazon Redshift - Fatal编程技术网

Amazon web services 使用复制功能自动将数据加载到红移

Amazon web services 使用复制功能自动将数据加载到红移,amazon-web-services,amazon-s3,amazon-redshift,Amazon Web Services,Amazon S3,Amazon Redshift,Amazon Redshift文档指出,将数据加载到数据库中的最佳方法是使用COPY函数。如何每天自动运行它,并将数据文件上载到S3 更长的版本:我启动了一个红移集群并设置了数据库。我已经创建了一个S3 bucket并上传了一个CSV文件。现在,从红移查询编辑器中,我可以轻松地手动运行复制功能。如何实现自动化?您可以在存储桶上创建一个外部表。红移会自动扫描bucket中的所有文件。但请记住,查询的性能可能不如通过复制加载数据时的性能好,但您获得的好处是不需要调度器 此外,一旦您有了一个外部表,您

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


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

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


此外,一旦您有了一个外部表,您可以将其加载一次,并将单个
CREATE table作为SELECT。。。从您的\u外部\u表中
。这种方法的好处是它是幂等的——你不需要跟踪你的文件——它总是加载来自桶中所有文件的所有数据。

在你完成你的方法之前,你应该考虑以下要点:

  • 如果可能的话,将csv文件压缩到GZIP中,然后吸收到相应的红移表中。这将减少您的文件大小,并具有良好的余量,并将提高整体数据接收性能

  • 完成表列的压缩方案。如果您希望使用红移来执行此任务,则可以使用copy命令中的“computepdate ON”启用自动压缩。参考文件

  • 现在,回答你的问题:

    由于您已经为同一个表创建了S3 bucket,请为每个表创建目录并将文件放在那里。如果输入文件较大,请将其拆分为多个文件(应根据节点数量选择文件数量,以实现更好的并行摄取,有关更多详细信息,请参阅aws文档)

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

    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"
    
    PGPASSWORD=psql-h-d-p 5439-U-c“从's3:///'凭证'aws_iam_角色='delimiter','region''GZIP在REMOVEQUOTES IGNOREHEADER 1上计算更新”
    
    下一步是创建lambda并通过红移s3 bucket启用sns,一旦您在s3 bucket接收到新文件,这个sns就会触发lambda。另一种方法是将cloudwatch调度程序设置为运行lambda

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


    兰博达有15分钟的限制,如果这是你关心的问题,那么法尔盖特会更好。在EC2上运行作业将导致比lambda或fargate更多的计费(以防您忘记关闭EC2机器)

    您有几个选择!最简单的方法是设置一个cron作业,每天在某个特定时间在ec2实例上运行,cron作业将使用psql运行复制命令谢谢,我将研究psql。您可以编写一个lambda函数,每当文件上传到bucket中时,触发器都会运行它。这是几行代码,我在这种情况下使用python和boto3 Lambda可以,但15分钟后会超时。@MiloBellano我在哪里编写那些Lambda函数?