简化将数据加载到 Amazon Redshift 中缓慢变化的维度的 2 类中

成千上万的客户依赖 Amazon Redshift 来构建数据仓库,通过快速、简单和安全的大规模分析来缩短获得见解的时间,并通过运行复杂的分析查询来分析从太字节到千兆字节的数据。组织创建 数据集市 ,这些集市是数据仓库的子集,通常用于获取特定于业务部门或团队的分析见解。 星型架构 是用于构建数据集市的常用数据模型。

在这篇文章中,我们将介绍如何在 Amazon Redshift 中简化将数据加载到缓慢变化的类型 2 维度中。

星型架构和缓慢变化的维度概述

星型架构是最简单的 维度模型 类型 ,其中星形中心可以有一个 事实表 和多个相关的 维度 表。维度是一种捕获参考数据和关联层次结构的结构,而事实表则捕获可以按维度汇总的不同值和指标。维度允许最终用户使用熟悉的 SQL 命令以各种方式对数据进行切片和切片,从而为探索性业务问题提供答案。

虽然操作源系统仅包含最新版本 的主数据 ,但星型架构使时空旅行查询能够在事实交易或事件实际发生的过去日期重现维度属性值。星型架构数据模型允许分析用户查询历史数据,将指标与相应的维度属性值联系起来。时空旅行是可能的,因为维度表包含不同时间范围内的关联属性的确切版本。相对于每天甚至每小时不断变化的指标数据,维度属性的变化频率较低。因此,跟踪一段时间内变化的星型架构中的维度被称为 缓慢变化的维度 (SCD)。

数据加载是维护数据仓库的关键方面之一。在星型架构数据模型中,中央事实表依赖于周围的维度表。这是以主键与外键关系的形式捕获的,其中维度表的主键由事实表中的外键引用。 对于 Amazon Redshift,不强制执行唯一性、主键和外键限制 。 但是,声明它们将有助于优化器得出最佳的查询计划,前提是数据加载过程能够确保其完整性。作为数据加载的一部分,维度表(包括 SCD 表)首先加载,然后加载事实表。

SCD 人口挑战赛

填充 SCD 维度表涉及合并来自多个源表的数据,这些数据通常 是标准化的。 SCD 表包含两列代表记录有效日期范围的日期列(生效日期和到期日期)。更改将作为新的活跃记录插入,自数据加载之日起生效,同时当前活动记录将在前一天过期。在每次数据加载期间,传入的变更记录会与现有的活动记录进行匹配,比较每个属性值以确定现有记录是否已更改或已删除,或者是否有新记录传入。

在这篇文章中,我们演示了如何使用以下方法简化向维度表中加载数据:

  • 使用 Amazon Simple Storage Servic e (Amazon S3) 托管源系统表中的初始和增量数据文件
  • 使用 Amazon Redshift Spectrum 访问 S3 对象进行数据处理 以在 Amazon Redshift 中加载原生表
  • 使用窗口函数创建视图以在 Amazon Redshift 中复制每个表的源系统版本
  • 将源表视图连接到与维度表架构匹配的项目属性
  • 将增量数据应用到维度表,使其与源端更改保持同步

解决方案概述

在现实场景中,源系统表中的记录会定期提取到 Amazon S3 位置,然后加载到 Amazon Redshift 的星型架构表中。

在本演示中,将来自两个源表( 客户_master 和customer_ ad dress)的数据合并起来 ,填充目标维度表 dim_cu stomer 即客户 维度表。

源表 customer_master 和 c ustomer_ address 共享相同的主键 c ustomer_id ,并将合并到同一个主键上,以获取每个 c ustomer_ id 的一条记录以及两个表中的属性。 row_audit_ts 包含插入或上次更新特定源记录的最新时间戳。此列有助于识别自上次数据提取以来的变更记录。

rec_source_ stat us 是一个可选列,用于指示相应的源记录是否已插入、更新或删除。这适用于源系统本身提供更改并适当地填充 rec_source_ status 的情况。

下图提供了源表和目标表的架构。

让我们仔细看看目标表 d im_c ustomer 的架构。它包含不同类别的列:

  • 密钥 — 它包含两种类型的密钥:
    • customer_sk 是此表的主键。它也被称为 代理密钥 ,具有单调递增的唯一值。
    • customer_id 是源主键,提供对源系统记录的引用。
  • SCD2 元数据 — rec_eff_d t 和 rec_exp_dt 表示 记录的状态 。这两列共同定义了记录的有效性。对于当前活跃的 记录,rec_exp_dt 中的值 将设置为 “9999-12-31”
  • 属性 -包括 名字 、姓 氏 、 雇主姓名 、电子邮件ID、城市和国家

将数据加载到 SCD 表中涉及首次批量数据加载,称为 初始数据 加载。 接下来是连续或定期的数据加载,称为 增量数据加载 ,以使记录与源表中的变化保持同步。

为了演示解决方案,我们完成了初始数据加载(1—7)和增量数据加载(8—12)的以下步骤:

  1. 将源数据文件放置在 Amazon S3 位置,每个源表使用一个子文件夹。
  2. 使用 A WS Glu e 爬虫解析数据文件并在 亚马逊云科技 Glue 数据目录中注册表。
  3. 在 Amazon Redshift 中创建外部架构以指向包含这些表的 亚马逊云科技 Glue 数据库。
  4. 在 Amazon Redshift 中,为每个源表创建一个视图,以获取每个主键 (c ustomer_ id) 值的最新版本的记录。
  5. 在 Amazon Redshift 中创建 d im_c ustomer 表,其中包含来自所有相关源表的属性。
  6. 在 Amazon Redshift 中创建一个视图,将步骤 4 中的源表视图连接起来,以投影维度表中建模的属性。
  7. 将步骤 6 中创建的视图中的初始数据填充到 dim_customer 表中,生成 customer_s k。
  8. 将每个源表的增量数据文件放到相应的 Amazon S3 位置。
  9. 在 Amazon Redshift 中,创建一个临时表来容纳仅限更改的记录。
  10. 加入步骤 6 和 dim_custom er 中的视图 ,识别比较属性的组合哈希值的变更记录。使用 I U D 指示器将变更记录填充到临时表 中。
  11. d im_customer 中更新临时表中所有 U D 记录 的 rec_e x p_dt。
  12. 将记录插入到 d im_custom er 中 ,查询临时表中的所有 I U 记录。

先决条件

在开始之前,请确保满足以下先决条件:

  • 拥有 A WS 账户
  • 创建一个 S3 存储桶 ,用于 存储将加载到 Amazon Redshift 中的数据文件。
  • 创建亚马逊 Redshift 集群或终端节点。有关说明,请参阅 亚马逊 Redshi ft 入门
  • 当您的环境准备就绪后,打开 Amazon Redshift 查询编辑器 v2.0 (参见以下屏幕截图)并连接到您的 Amazon Redshift 集群或终端节点。

来自源表的土地数据

为 S3 存储桶中的每个源表创建单独的子文件夹,并将初始数据文件放在相应的子文件夹中。在下图中,客户_master 和 customer_address 的初始数据文件在 两个 不同的子文件夹中可用。要试用该解决方案,你可以使用 customer_master_with_ts.csv customer_address_with_ts.csv 作为初始数据文件。

重要的是要包括一个审计时间戳 ( row_audit_ts ) 列,该列指示每条记录的插入时间或上次更新的时间。作为增量数据加载的一部分,具有相同主键值 ( customer_id ) 的行可以多次到达。 row_audit_ts 列有助于识别给定 c ustomer_id 的此类记录的最新版本,用于进一步处理。

在 亚马逊云科技 Glue 数据目录中注册源表

我们使用 亚马逊云科技 Glue 爬虫从分隔的数据文件(例如本文中使用的 CSV 文件)中推断出元数据。有关开始使用 亚马逊云科技 Glue 爬虫的说明,请参阅 教程:添加 亚马逊云科技 Glue 爬 虫

创建 亚马逊云科技 Glue 爬虫并将其指向包含源表子文件夹的 Amazon S3 位置,其中放置了相关的数据文件。在创建 亚马逊云科技 Glue 爬虫时,创建一个名为 r s-dimension-blog 的新数据库。以下屏幕截图显示了为数据文件选择的 亚马逊云科技 Glue 爬虫配置。

请注意,在 “ 设置输出和调度 ” 部分,高级选项保持不变。

运行此爬虫应在 rs-dimension- blog 数据库中创建以下表:

  • 客户地址
  • 客户主管

在 Amazon Redshift 中创建架构

首先,创建一个名为 rs-dim-blog-spectrum- role 的 A WS 身份和访问管理 (IAM) 角色。有关说明,请参阅为 亚马逊 Red shift 创建 IAM 角色

IAM 角色将 Amazon Redshift 作为可信实体,权限策略包括 Am azons3ReadonlyAccess 和 awsGl ueConsoleFullAcces s,因为 我们使用的是 AWS G lue 数据目录。然后 将 IAM 角色 与 Amazon Redshift 集群或终端节点相关联。

相反,您也可以将 IAM 角色设置为 Amazon Redshift 集群或终端节点的默认 角色。 如果这样做,则在下面的 创建外部架构 命令中,将 iam_role 参数 作为 iam_role 默认值传递。

现在,打开 Amazon Redshift 查询编辑器 V2 并创建一个外部架构,传递新创建的 IAM 角色并将数据库指定为 rs-dimension-blog。 数据库名称 rs-dimension-blog 是在上一节配置爬虫时在数据目录中创建的名称。参见以下代码:

create external schema spectrum_dim_blog 
from data catalog 
database 'rs-dimension-blog' 
iam_role 'arn:aws:iam::<accountid>:role/rs-dim-blog-spectrum-role';

检查前一节中在数据目录中注册的表是否可以从 Amazon Redshift 中看到:

select * 
from spectrum_dim_blog.customer_master 
limit 10;

select * 
from spectrum_dim_blog.customer_address 
limit 10;

这些查询中的每一个都将从相应的数据目录表中返回 10 行。

在 Amazon Redshift 中创建另一个架构来托管表 dim_customer :

create schema rs_dim_blog;

创建视图以从每个源表中获取最新记录

customer_master 表创建一个视图,将其 命名为 vw_cust_mst r_latest:

create view rs_dim_blog.vw_cust_mstr_latest as with rows_numbered as (
  select 
    customer_id, 
    first_name, 
    last_name, 
    employer_name, 
    row_audit_ts, 
    row_number() over(
      partition by customer_id 
      order by 
        row_audit_ts desc
    ) as rnum 
  from 
    spectrum_dim_blog.customer_master
) 
select 
  customer_id, 
  first_name, 
  last_name, 
  employer_name, 
  row_audit_ts, 
  rnum 
from 
  rows_numbered 
where 
  rnum = 1 with no schema binding;

前面的查询使用 row_number ,这是亚马逊 Redshift 提供的窗口函数。使用窗口函数可以更有效地创建分析业务查询。窗口函数对结果集的分区进行操作,并为该窗口中的每一行返回一个值。 row_num ber 窗口函数根据 OVER 子句中的 ORDER BY 表达式确定一组行中当前行的序号,从 1 开始计算。通过将 PARTITION BY 子句 添加为 customer_id ,可以为每个 customer_id 值创建组, 并为每个组重置序号。

客户地址 表创建一个视图,将其命名为 vw_cust_ addr_latest :

create view rs_dim_blog.vw_cust_addr_latest as with rows_numbered as (
  select 
    customer_id, 
    email_id, 
    city, 
    country, 
    row_audit_ts, 
    row_number() over(
      partition by customer_id 
      order by 
        row_audit_ts desc
    ) as rnum 
  from 
    spectrum_dim_blog.customer_address
) 
select 
  customer_id, 
  email_id, 
  city, 
  country, 
  row_audit_ts, 
  rnum 
from 
  rows_numbered 
where 
  rnum = 1 with no schema binding;

这两个视图定义都使用 Amazon Redshift 的 行号 窗口函数,按行_ aud it_ts 列(审计时间戳列)的 降序对记录进行排序。 条件 rnum=1 获取每个 customer_id 值的最新记录。

在亚马逊 Redshift 中创建 dim_customer 表

在 r s_dim_blog 架 构中,将 dim_customer 创建为亚马逊 Redshift 中的内部表。 维度表包括 customer_s k列 ,该列充当代理键列,使我们能够捕获每条客户记录的时间敏感版本。每条记录的有效期由 rec_eff_dt 和 rec_exp_dt 列定义 ,分别代表记录生效 日期 和记录到期 日期。参见以下代码:

create table rs_dim_blog.dim_customer (
  customer_sk bigint, 
  customer_id bigint, 
  first_name varchar(100), 
  last_name varchar(100), 
  employer_name varchar(100), 
  email_id varchar(100), 
  city varchar(100), 
  country varchar(100), 
  rec_eff_dt date, 
  rec_exp_dt date
) diststyle auto;

创建视图以整合最新版本的源记录

创建视图 vw_dim_customer_src ,它使用 左外联接 合并来自两个源表的最新记录,随时准备将其填充到 Amazon Redshift 维度表中。此视图从 “创建视图以从每个源表中获取最新记录” 部分中定义的最新视图中获取数据:

create view rs_dim_blog.vw_dim_customer_src as 
select 
  m.customer_id, 
  m.first_name, 
  m.last_name, 
  m.employer_name, 
  a.email_id, 
  a.city, 
  a.country 
from 
  rs_dim_blog.vw_cust_mstr_latest as m 
  left join rs_dim_blog.vw_cust_addr_latest as a on m.customer_id = a.customer_id 
order by 
  m.customer_id with no schema binding;

此时,此视图会获取初始数据以加载到我们即将创建的 dim_cu stomer 表中。在您的用例中,使用类似的方法来创建和联接所需的源表视图,以填充目标维度表。

将初始数据填充到 dim_customer

通过查询视图 vw_dim_customer_src 将初始数据填充到 dim_custom er 表中。 因为这是初始数据加载,所以运行 row_number 窗口函数生成的行号 足以在 c ustomer_ sk 列中填充从 1 开始的唯一值:

insert into rs_dim_blog.dim_customer 
select 
  row_number() over() as customer_sk, 
  customer_id, 
  first_name, 
  last_name, 
  employer_name, 
  email_id, 
  city, 
  country, 
  cast('2022-07-01' as date) rec_eff_dt, 
  cast('9999-12-31' as date) rec_exp_dt 
from 
  rs_dim_blog.vw_dim_customer_src;

在此查询中,我们已将 “2022-07-01” 指定 为 rec_e ff_dt 中所有初始数据记录 的值。对于您的用例,您可以根据自己的情况修改此日期值。

前面的步骤完成了向 dim_c ustomer 表中加载的初始数据。在接下来的步骤中,我们将继续填充增量数据。

在 Amazon S3 中保存持续变更数据文件

初始加载后,源系统会持续提供数据文件,要么仅包含新的和更改的记录,要么包含特定表的所有记录的完整提取。

您可以使用示例文件 customer_master_with_ts_incr.csv customer_address_with_ts_incr.csv ,其中包含更改的记录和新记录。这些增量文件需要放置在 Amazon S3 中放置初始数据文件的同一位置。请参阅 “ 源表中的 土地数据 ” 部分。这将导致相应的 Redshift 频谱表自动读取额外的行。

如果您使用了 customer_master 的示例文件 ,则在添加增量文件后,以下查询会显示初始记录和增量记录:

select 
  customer_id, 
  first_name, 
  last_name, 
  employer_name, 
  row_audit_ts 
from 
  spectrum_dim_blog.customer_master 
order by 
  customer_id;

如果是完整的数据提取,我们可以通过比较以前和当前的版本并查找缺失的记录来识别源系统表中发生的删除。对于存在 rec_source_stat us 列的仅限更改的数据提取,其值将帮助我们识别已删除的记录。无论哪种情况,都要将正在进行的变更数据文件放到相应的 Amazon S3 位置。

在此示例中,我们上传了客户_ master 和customer_ address 源表的增量数据,其中一些 c ustomer_id 记录正在接收更新,并添加了一些新记录。

创建临时表来捕获变更记录

创建临时表 temp_dim_customer 来存储需要应用于目标 dim_customer 表的所有更改:

create temp table temp_dim_customer (
  customer_sk bigint, 
  customer_id bigint, 
  first_name varchar(100), 
  last_name varchar(100), 
  employer_name varchar(100), 
  email_id varchar(100), 
  city varchar(100), 
  country varchar(100), 
  rec_eff_dt date, 
  rec_exp_dt date, 
  iud_operation character(1)
);

使用新的和更改的记录填充临时表

这是一个多步骤流程,可以组合成单个复杂的 SQL。完成以下步骤:

  1. 通过查询视图 vw _dim_customer_src 来获取所有客户属性的最新版本:
select 
  customer_id, 
  sha2(
    coalesce(first_name, '') || coalesce(last_name, '') || coalesce(employer_name, '') || coalesce(email_id, '') || coalesce(city, '') || coalesce(country, ''), 512
  ) as hash_value, 
  first_name, 
  last_name, 
  employer_name, 
  email_id, 
  city, 
  country, 
  current_date rec_eff_dt, 
  cast('9999-12-31' as date) rec_exp_dt 
from 
  rs_dim_blog.vw_dim_customer_src;

Amazon Redshift 提供哈希函数,例如 sha2 ,它将可变长度的字符串输入转换为固定长度的字符输出。输出字符串是具有指定位数的校验和的十六进制值的文本表示形式。在这种情况下,我们传递一组我们要跟踪其变化的串联客户属性,将位数指定为 512。我们将使用哈希函数的输出来确定是否有任何属性发生了变化。该数据集将被称为 newver (新版本)。

因为我们将正在进行的变更数据存放在与初始数据文件相同的位置,因此从前面的查询( 查询 )中检索到的记录包括所有记录,甚至包括未更改的记录。 但是由于视图 vw_dim_customer_src 的定义,每个客户 ID 只能获得一条记录 ,这是基于 row_audit_ts 的最新版本。

  1. 以类似的方式,从 d im_customer 检索所有客户记录的最新版本,这些记录由 rec_exp_dt= ' 9999-12-31' 标识。 在这样做的同时,还要检索 dim _customer 中所有可用客户属性的s ha2 值:
select 
  customer_id, 
  sha2(
    coalesce(first_name, '') || coalesce(last_name, '') || coalesce(employer_name, '') || coalesce(email_id, '') || coalesce(city, '') || coalesce(country, ''), 512
  ) as hash_value, 
  first_name, 
  last_name, 
  employer_name, 
  email_id, 
  city, 
  country 
from 
  rs_dim_blog.dim_customer 
where 
  rec_exp_dt = '9999-12-31';

该数据集将被称为 oldver (旧版本或现有版本)。

  1. dim_c ustomer 表中识别当前的最大代理键值:
select 
  max(customer_sk) as maxval 
from 
  rs_dim_blog.dim_customer;

此值( maxval )将被添加到 row_num ber 中, 然后再用作需要插入的变更记录的 customer_sk 值。

  1. 在 c ustom er_id 列上对记录的旧版本( 旧版本 )和新版本( 新版本 )的记录执行完整的外部联接。然后比较 s ha2 函数生成的旧哈希值和新哈希值,以确定更改记录是插入、更新还是删除:
case when oldver.customer_id is null then 'I'
when newver.customer_id is null then 'D'
when oldver.hash_value != newver.hash_value then 'U'
else 'N' end as iud_op

我们按如下方式标记记录:

  • 如果旧 数据集中不存在 customer_ id oldv er.customer_id 为空 ),则 将其标记为插入内容('I')。
  • 否则,如果新 数据集中不 存在 客户 ID (n ewv er.customer_id 为空 ),则 将其标记为删除('D')。
  • 否则,如果旧的 哈希值 和新的 哈希值 不同,则这些记录表示更新( 'U' )。
  • 否则,它表示该记录未发生任何更改,因此可以忽略或标记为未处理 ( 'N' )。

如果源数据提取包含 rec_source_status 以识别已删除的记录 ,请务必修改前面的逻辑 。

尽管 sha2 输出将可能无限的输入字符串映射到一组有限的输出字符串,但原始行值的哈希值与更改的行值发生冲突的可能性很小。我们没有单独比较前后的每列值,而是比较 s ha2 生成的哈希值, 以得出客户记录的任何属性是否发生了变化。对于您的用例,我们建议您在进行充分测试后选择适用于您的数据条件的 哈希函数 。相反,如果所有哈希函数都不能令人满意地满足您的期望,则可以比较各个列的值。

  1. 结合前面步骤的输出,让我们创建 INSERT 语句,该语句仅捕获变更记录以填充临时表:
insert into temp_dim_customer (
  customer_sk, customer_id, first_name, 
  last_name, employer_name, email_id, 
  city, country, rec_eff_dt, rec_exp_dt, 
  iud_operation
) with newver as (
  select 
    customer_id, 
    sha2(
      coalesce(first_name, '') || coalesce(last_name, '') || coalesce(employer_name, '') || coalesce(email_id, '') || coalesce(city, '') || coalesce(country, ''), 512
    ) as hash_value, 
    first_name, 
    last_name, 
    employer_name, 
    email_id, 
    city, 
    country, 
    current_date rec_eff_dt, 
    cast('9999-12-31' as date) rec_exp_dt 
  from 
    rs_dim_blog.vw_dim_customer_src
), 
oldver as (
  select 
    customer_id, 
    sha2(
      coalesce(first_name, '') || coalesce(last_name, '') || coalesce(employer_name, '') || coalesce(email_id, '') || coalesce(city, '') || coalesce(country, ''), 512
    ) as hash_value, 
    first_name, 
    last_name, 
    employer_name, 
    email_id, 
    city, 
    country 
  from 
    rs_dim_blog.dim_customer 
  where 
    rec_exp_dt = '9999-12-31'
), 
maxsk as (
  select 
    max(customer_sk) as maxval 
  from 
    rs_dim_blog.dim_customer
), 
allrecs as (
  select 
    coalesce(oldver.customer_id, newver.customer_id) as customer_id, 
    case when oldver.customer_id is null then 'I' when newver.customer_id is null then 'D' when oldver.hash_value != newver.hash_value then 'U' else 'N' end as iud_op, 
    newver.first_name, 
    newver.last_name, 
    newver.employer_name, 
    newver.email_id, 
    newver.city, 
    newver.country, 
    newver.rec_eff_dt, 
    newver.rec_exp_dt 
  from 
    oldver full 
    outer join newver on oldver.customer_id = newver.customer_id
) 
select 
  (maxval + (row_number() over())) as customer_sk, 
  customer_id, 
  first_name, 
  last_name, 
  employer_name, 
  email_id, 
  city, 
  country, 
  rec_eff_dt, 
  rec_exp_dt, 
  iud_op 
from 
  allrecs, 
  maxsk 
where 
  iud_op != 'N';

使更新的客户记录过期

由于 temp_dim_custom er 表现在仅包含变更记录( “I” 、“ U ” 或 “ D ” ) ,因此同样的内容可以应用于目标 dim_customer 表。

让我们首先获取 iud_ op 列 中值为 “ U ” 或 “D” 的所有记录。这些记录已在源系统中被删除或更新。由于 dim_c ustomer 是一个缓慢变化的维度,因此它需要反映每条客户记录的有效期。在这种情况下,我们会过期已更新或删除的当前有效记录。 我们从昨天(通过设置 rec_exp_dt=current_dt=current_date-1)在 customer_ id 列中匹配的记录到期:

update 
  rs_dim_blog.dim_customer 
set 
  rec_exp_dt = current_date - 1 
where 
  customer_id in (
    select 
      customer_id 
    from 
      temp_dim_customer as t 
    where 
      iud_operation in ('U', 'D')
  ) 
  and rec_exp_dt = '9999-12-31';

插入新的和更改的记录

最后一步,我们需要插入更新记录的更新版本以及所有首次插入的记录。 在 temp_dim_c ust omer 表 iud_op 列中,它们分别由 “U” 和 “I” 表示:

insert into rs_dim_blog.dim_customer (
  customer_sk, customer_id, first_name, 
  last_name, employer_name, email_id, 
  city, country, rec_eff_dt, rec_exp_dt
) 
select 
  customer_sk, 
  customer_id, 
  first_name, 
  last_name, 
  employer_name, 
  email_id, 
  city, 
  country, 
  rec_eff_dt, 
  rec_exp_dt 
from 
  temp_dim_customer 
where 
  iud_operation in ('I', 'U');

根据 SQL 客户端的设置,您可能需要运行 提交事务; 命令来验证之前的更改是否成功保留在 Amazon Redshift 中。

检查最终输出

您可以运行以下查询,看到 dim_custom er 表现在包含初始数据记录和增量数据记录,从而捕获在增量数据加载过程中更改的 customer_id 值的多个版本。输出还表明,每条记录都已在 rec_eff_dt 和 rec_exp_dt 中填充了与记录有效 期相对 应的相应值。

select 
  * 
from 
  rs_dim_blog.dim_customer 
order by 
  customer_id, 
  customer_sk;

对于本文中提供的示例数据文件,前面的查询返回以下记录。如果你使用的是这篇文章中提供的示例数据文件,请注意 customer_sk 中的值 可能与下表中显示的值不匹配。

在这篇文章中,我们只展示重要的 SQL 语句;完整的 SQL 代码可在 load_scd2_sample_dim_customer.sql 中找到 。

清理

如果您不再需要创建的资源,则可以将其删除以防止产生额外费用。

结论

在这篇文章中,您学习了如何在 Amazon Redshift 中简化数据加载到 Type-2 SCD 表中,包括初始数据加载和增量数据加载。该方法处理填充目标维度表的多个源表,在每次运行时捕获最新版本的源记录。

有关更多材料和其他 最佳实践 ,请参阅 Amazon Redshift 数据加载 最佳实践;有关实施 更新和插入 的说明,请参阅更新和插入新数据


作者简介

Vaidy Kalpath y 是 亚马逊云科技 的高级数据实验室解决方案架构师,他帮助客户实现数据平台现代化并定义端到端数据策略,包括数据提取、转换、安全、可视化。他热衷于从商业用例向后研究,创建可扩展和可定制的架构,以帮助客户使用 亚马逊云科技 上的数据分析服务进行创新。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。