如何在写入 Redshift DW 之前转换 S3 存储桶中的数据?
How to transform data from S3 bucket before writing to Redshift DW?
我正在使用 redshift 创建一个(现代)数据仓库。我们所有的基础设施都托管在亚马逊上。到目前为止,我已经设置 DMS 以从我们的业务数据库(SQL EC2 上的服务器,而不是 RDS)的一些表中提取数据(包括更改的数据)并将其直接存储到 S3。
现在,我必须先从 S3 转换和丰富这些数据,然后才能将其写入 Redshift。我们的 DW 有一些用于事实和维度的表(星型模式),因此,想象一个客户维度,它不仅应该包含客户基本信息,还应该包含地址信息、城市、州等。这些数据分布在几个表中我们的业务数据库。
所以这是我的问题,我不清楚如何查询 S3 暂存区以连接这些表并将其写入我的 redshift DW。我想使用 Glue、Kinesis 等 AWS 服务来完成它,即完全无服务器。
Kinesis能完成这个任务吗?如果我将我的暂存区域从 S3 移动到 Redshift 是否会让事情变得更容易,因为我们所有的数据在本质上都是高度相关的?如果是这样,问题仍然存在,如何在将数据保存到我们的 DW 模式之前 transform/enrich 数据?我到处搜索这个特定主题,但相关信息很少。
感谢任何帮助。
有很多方法可以做到这一点,但一个想法是使用 Redshift Spectrum 查询数据。 Spectrum 是一种使用 Redshift 集群查询 S3(称为外部数据库)的方法。
非常高级,一种方法是创建一个 Glue Crawler 作业来爬取您的 S3 存储桶,这会创建 Redshift Spectrum 可以查询的外部数据库。
这样,您就无需将数据移至 Redshift 本身。您可能希望将 "staging" 区域保留在 S3 中,并且只将准备好用于报告或分析的数据带入 Redshift,这将是您的 Customer Dim table.
这是执行此操作的文档:https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum.html
安排 ETL SQL:我认为 Redshift 中没有内置的安排工具,但您可以通过几种方式做到这一点:
1) 获取 ETL 工具或在服务器或 Glue 上设置 CRON 作业,将 SQL 脚本安排为 运行。我使用连接到数据库的 Python 脚本然后 运行s SQL 文本来执行此操作。这将更像是一个批量操作。您也可以在 Lambda 函数中执行此操作,并将其安排在 Cloudwatch 触发器上,该触发器可以按 cron 计划
2) 使用 Lambda 函数,该函数 运行 是您希望触发 S3 PUT 到该存储桶中的 SQL 脚本。这样脚本将在文件删除时 运行 正确。这基本上是一个实时操作。 DMS 丢弃文件的速度非常快,因此您每分钟会丢弃多次文件,这可能更难处理。
一个选项是将 'raw' 数据作为 'staging' 表加载到 Redshift 中。然后,运行 SQL 命令将数据(JOIN 等)操作成所需的格式。
最后,将结果数据复制到用户查询的'public'个表中。
这是一个正常的提取-加载-转换过程(与 ETL 略有不同),它使用 Redshift 的功能进行转换。
我正在使用 redshift 创建一个(现代)数据仓库。我们所有的基础设施都托管在亚马逊上。到目前为止,我已经设置 DMS 以从我们的业务数据库(SQL EC2 上的服务器,而不是 RDS)的一些表中提取数据(包括更改的数据)并将其直接存储到 S3。
现在,我必须先从 S3 转换和丰富这些数据,然后才能将其写入 Redshift。我们的 DW 有一些用于事实和维度的表(星型模式),因此,想象一个客户维度,它不仅应该包含客户基本信息,还应该包含地址信息、城市、州等。这些数据分布在几个表中我们的业务数据库。
所以这是我的问题,我不清楚如何查询 S3 暂存区以连接这些表并将其写入我的 redshift DW。我想使用 Glue、Kinesis 等 AWS 服务来完成它,即完全无服务器。
Kinesis能完成这个任务吗?如果我将我的暂存区域从 S3 移动到 Redshift 是否会让事情变得更容易,因为我们所有的数据在本质上都是高度相关的?如果是这样,问题仍然存在,如何在将数据保存到我们的 DW 模式之前 transform/enrich 数据?我到处搜索这个特定主题,但相关信息很少。
感谢任何帮助。
有很多方法可以做到这一点,但一个想法是使用 Redshift Spectrum 查询数据。 Spectrum 是一种使用 Redshift 集群查询 S3(称为外部数据库)的方法。
非常高级,一种方法是创建一个 Glue Crawler 作业来爬取您的 S3 存储桶,这会创建 Redshift Spectrum 可以查询的外部数据库。
这样,您就无需将数据移至 Redshift 本身。您可能希望将 "staging" 区域保留在 S3 中,并且只将准备好用于报告或分析的数据带入 Redshift,这将是您的 Customer Dim table.
这是执行此操作的文档:https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum.html
安排 ETL SQL:我认为 Redshift 中没有内置的安排工具,但您可以通过几种方式做到这一点:
1) 获取 ETL 工具或在服务器或 Glue 上设置 CRON 作业,将 SQL 脚本安排为 运行。我使用连接到数据库的 Python 脚本然后 运行s SQL 文本来执行此操作。这将更像是一个批量操作。您也可以在 Lambda 函数中执行此操作,并将其安排在 Cloudwatch 触发器上,该触发器可以按 cron 计划
2) 使用 Lambda 函数,该函数 运行 是您希望触发 S3 PUT 到该存储桶中的 SQL 脚本。这样脚本将在文件删除时 运行 正确。这基本上是一个实时操作。 DMS 丢弃文件的速度非常快,因此您每分钟会丢弃多次文件,这可能更难处理。
一个选项是将 'raw' 数据作为 'staging' 表加载到 Redshift 中。然后,运行 SQL 命令将数据(JOIN 等)操作成所需的格式。
最后,将结果数据复制到用户查询的'public'个表中。
这是一个正常的提取-加载-转换过程(与 ETL 略有不同),它使用 Redshift 的功能进行转换。