如何在写入 Redshift DW 之前转换 S3 存储桶中的数据?



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

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

所以这是我的问题,我不清楚如何查询 S3 暂存区以连接这些表并将其写入我的红移 DW。我想使用 Glue、Kinesis 等 AWS 服务来做到这一点,即完全无服务器。

Kinesis能完成这个任务吗?如果我将暂存区域从 S3 移动到 Redshift 会让事情变得更容易吗?因为我们所有的数据本质上都是高度相关的?如果是这样,问题仍然存在,如何在将数据保存在我们的 DW 架构上之前转换/丰富数据?我已经到处搜索这个特定的主题,但关于它的信息是稀缺的。

任何帮助,不胜感激。

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

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

这样,您无需将数据移动到Redshift本身。您可能希望将"暂存"区域保留在 S3 中,并且仅将准备用于报告或分析的数据引入 Redshift,这将是您的客户暗淡表。

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

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

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

2( 使用 Lambda 函数运行您希望在该存储桶中触发 S3 PAT 的 SQL 脚本。这样,脚本将在文件删除时立即运行。这基本上是一个实时操作。DMS会非常快速地删除文件,因此每分钟都会有文件丢弃多次,因此可能更难处理。

一种选择是将"原始"数据作为"临时"表加载到 Redshift 中。然后,运行 SQL 命令将数据(JOIN 等(操作为所需的格式。

最后,将生成的数据复制到用户查询的"公共"表中。

这是一个正常的提取-加载-转换过程(与 ETL 略有不同(,它使用 Redshift 的功能来执行转换。

最新更新