递归地将数据从 redshift 卸载到 S3 存储桶

Posted

技术标签:

【中文标题】递归地将数据从 redshift 卸载到 S3 存储桶【英文标题】:recursively unload data from redshift to S3 buckets 【发布时间】:2018-02-16 06:44:23 【问题描述】:

我正在尝试为每次运行递归地将数据从 redshift 卸载到不同文件夹中的 S3 存储桶中。有没有办法通过 redshift 卸载命令来做到这一点?

unload ('从场地中选择 *') 到 's3://mybucket/tikit/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 清单;

我希望 s3 存储桶有这个子文件夹:

s3://mybucket/tikit/venue_12/venue_0000_part_00 s3://mybucket/tikit/venue_21/venue_0000_part_00 s3://mybucket/tikit/venue_34/venue_0000_part_00

这个场地_*,其中 * 来自卸载命令中的选择查询

【问题讨论】:

【参考方案1】:

您必须设计一个包含表列表的元数据表,并在元数据表中根据需要添加条件。 1.借助python/其他脚本语言读取元数据并为具有特定存储桶的各个表执行卸载命令(通常表名作为存储桶名或您喜欢的任何其他格式) 2. 执行上述代码,将数据卸载到各个bucket中

【讨论】:

【参考方案2】:

使用在 EC2 实例或其他任何地方运行的 python 脚本,您可以实现这一点。

例如,如果您想导出每新的 10000 行数据,您可以将其添加到您的 UNLOAD 查询中,并使用 Python 程序跟踪要卸载的当前 偏移量 .

unload ('select * from venue WHERE ID > offset and ID < offset+10000') to 's3://mybucket/tickit/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest;  

并以所需的时间间隔执行上述查询,并将数据存储在所需的文件名/文件路径中。

【讨论】:

感谢您的建议。我们可以运行查询并根据输出值直接创建单个文件而无需脚本吗? s3://mybucket/tickit/venue_1/venue_0000_part_01.csv s3://mybucket/tickit/venue_1/venue_0000_part_02.csv s3://mybucket/tickit/venue_1/venue_0000_part_03.csv 您可以在 SQL 查询本身中任意设置输出文件的名称。所以是的,你可以这样做。如果它回答了您的问题,请对答案进行投票并将其标记为已接受。谢谢

以上是关于递归地将数据从 redshift 卸载到 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Redshift - 卸载到 S3 - 动态 S3 文件名

如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?

将数据从 Amazon redshift 卸载到 Amazon s3

从 Redshift 卸载到 S3 时 JDBC 连接丢失。应该发生啥?

使用 Spectrify 以 Parquet 格式将数据从 Redshift 卸载到 S3

从 Redshift 卸载到 S3:身份验证不起作用