首页 > 解决方案 > 如何在写入 Redshift DW 之前从 S3 存储桶转换数据?

问题描述

我正在用 redshift 创建一个(现代)数据仓库。我们所有的基础设施都托管在亚马逊上。到目前为止,我已经设置 DMS 以从我们的业务数据库(EC2 上的 SQL Server,而不是 RDS)的某些表中提取数据(包括更改的数据)并将其直接存储到 S3。

现在,我必须先转换和丰富 S3 中的这些数据,然后才能将其写入 Redshift。我们的 DW 有一些事实和维度表(星型模式),所以,想象一个客户维度,它不仅应该包含客户基本信息,还应该包含地址信息、城市、州等。这些数据分布在几个表中我们的业务数据库。

所以这是我的问题,我不清楚如何查询 S3 暂存区以加入这些表并将其写入我的 redshift DW。我想使用 Glue、Kinesis 等 AWS 服务来实现,即完全无服务器。

Kinesis 能否完成这项任务?如果我将暂存区从 S3 移到 Redshift 会不会让事情变得更容易,因为我们所有的数据本质上都是高度相关的?如果是这样,那么问题仍然存在,如何在将数据保存到我们的 DW 模式之前对其进行转换/丰富?我到处搜索这个特定的主题,但关于它的信息很少。

任何帮助表示赞赏。

标签: amazon-s3amazon-redshiftetldata-warehouse

解决方案


有很多方法可以做到这一点,但一种想法是使用 Redshift Spectrum 查询数据。Spectrum 是一种使用 Redshift 集群查询 S3(称为外部数据库)的方法。

真正高级别的一种方法是创建一个 Glue Crawler 作业来抓取您的 S3 存储桶,这会创建 Redshift Spectrum 可以查询的外部数据库。

这样,您无需将数据移动到 Redshift 本身。您可能希望将“暂存”区域保留在 S3 中,并且只将准备好用于报告或分析的数据(即 Customer Dim 表)引入 Redshift。

这是执行此操作的文档:https ://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum.html

调度 ETL SQL:我不相信 Redshift 中内置了调度工具,但您可以通过以下几种方式做到这一点:

1) 获取 ETL 工具或在服务器或 Glue 上设置 CRON 作业,以安排运行 SQL 脚本。我使用连接到数据库的 Python 脚本执行此操作,然后运行 ​​SQL 文本。这将是一个多一点的批量操作。您也可以在 Lambda 函数中执行此操作,并将其安排在 Cloudwatch 触发器上,该触发器可以在 cron 计划上

2) 使用 Lambda 函数运行您想要触发 S3 PUT 到该存储桶的 SQL 脚本。这样脚本将在文件删除时正确运行。这基本上是一个实时操作。DMS 会非常快速地删除文件,因此您将每分钟多次删除文件,这可能更难以处理。


推荐阅读