


Amazon Redshift 是一个数据处理快速、全托管的云数据仓库,通过标准 SQL和商业智能工具分析数据,非常经济高效。你可以使用 Amazon Redshit 来分析结构化教据和半结构化数据,还能无缝查询数据湖和运营数据库。AWS 提供的硬件和基于自动机器学习 (ML) 的调优功能可大规模降低成本,实现高性价比。
Amazon Redshift 除了具有高性价比优势,还提供其他优化功能。你可以利用这些优化功能进一步提高性能,缩短从数据仓库查询数据的响应时间。
其中一种优化功能是以实体化视图的形式预先计算查询结果,从而缩短查询运行时。Amazon Redshift 的实体化视图功能可以加快在大型表上运行査询的速度,特别适合涉及聚合和多表关联 (join) 的查询。实体化视图不仅可以存储查询的预计算结果集,还支持对本地表进行增量刷新。
通常,用户会使用数据湖表来实现经济高效的存储以及与其他工具的互操作。利用 Apache Iceberg 等开放式表格式 (OTF),持续新增和更新数据。
现在,Amazon Redshift 提供了增量式刷新数据湖表的实体化视图功能,支持 Apache Iceberg 等开放式文件和表格式。
在这篇文章中,我们将逐步介绍为了实现实体化视图的增量刷新,需要在开放式文件和事务性数据湖表上执行哪些操作。
前提条件
要完成本文中的示例操作,需要满足以下前提条件:
- 你可以使用你已有的 Redshift 数据仓库和数据湖测试增量刷新你的账户中的标准数据湖表的实体化视图。如果想要使用我们提供的示例数据进行测试,请先下载示例数据。示例数据文件是以“|”分隔的文本文件。
- 为 Amazon Redshift 关联一个 AWS Identity and Access Management (IAM) 角色,用于授予 Redshift Spectrum 与 Amazon Simple Storage Service (Amazon S3) 和 AWS Glue 结合使用所需的最低权限。
- 将该角色设置为 Amazon Redshift 集群的默认 IAM 角色。
基于标准数据湖表的实体化视图增量刷新
这个章节中,我们将介绍如何在 Amazon Redshift 中基于 Amazon S3 存储桶中的标准文本文件构建实体化视图并进行增量刷新,从而以经济高效的方法保持数据新鲜度。
- 将第一个文件 customer.tbl.1(该文件是在前提条件步骤中下载的)上传到目标 S3 存储桶中前缀为 customer 的位置。
- 使用 Query Editor v2 连接到你的 Amazon Redshift Serverless 工作组或 Redshift 预配集群。
- 创建外部 Schema。
create external schema datalake_mv_demo
from data catalog
database 'datalake-mv-demo'
iam_role default;

4. 使用上一步创建的外部 Schema datalake_mv_demo创建一个名为 customer 的外部表。
create external table datalake_mv_demo.customer(
c_custkey int8,
c_name varchar(25),
c_address varchar(40),
c_nationkey int4,
c_phone char(15),
c_acctbal numeric(12, 2),
c_mktsegment char(10),
c_comment varchar(117)
) row format delimited fields terminated by '|' stored as textfile location 's3://<your-s3-bucket-name>/customer/';
5. 验证该外部表 customer 中的示例数据。
select * from datalake_mv_demo.customer;

6. 基于该外部表创建实体化视图。
CREATE MATERIALIZED VIEW customer_mv
AS
select * from datalake_mv_demo.customer;
.aec0d22b6590d47e505db7901ffa52a6c6529d62.png)
7. 验证实体化视图中的数据。
select * from customer_mv limit 5;

8. 将一个新文件 customer.tbl.2 上传到同一 S3 存储桶中前缀为 customer 的位置。该文件包含一条额外的数据记录。
.eefe694ea27dbc21f6595990c5a68d3e44dd06c4.png)
9. 使用 Query Editor v2 刷新实体化视图 customer_mv。
REFRESH MATERIALIZED VIEW customer_mv;

10. 验证添加此新文件后实体化视图是否增量刷新。
select mv_name, status, start_time, end_time
from SYS_MV_REFRESH_HISTORY
where mv_name='customer_mv'
order by start_time DESC;

11. 查询实体化视图 customer_mv 中的当前数据行数。
select count(*) from customer_mv;

12. 从 S3 存储桶中前缀为 customer 的位置,删除现有文件 customer.tbl.1。现在,此 S3 存储桶中前缀为 customer 的位置下应仅有 customer.tbl.2 一个文件。

13. 再次使用 Query Editor v2 刷新实体化视图 customer_mv。
REFRESH MATERIALIZED VIEW customer_mv;
14. 验证删除其中一个已有文件后实体化视图是否刷新。
select mv_name, status, start_time, end_time
from SYS_MV_REFRESH_HISTORY
where mv_name='customer_mv'
order by start_time DESC;

15. 查询实体化视图 customer_mv 中的当前数据行数。现在应该只有 customer.tbl.2 文件中的一条数据。
select count(*) from customer_mv;

16. 修改之前下载的 customer.tbl.2 文件的内容,将 customer 键从 999999999 更改为 111111111。

17. 保存修改后的文件,并将该文件上传到同一 S3 存储桶中前缀为 customer 的位置,覆盖该位置下现有的同名文件。
18. 使用 Query Editor v2 刷新实体化视图 customer_mv。
select count(*) from customer_mv;
19. 验证文件中的数据更改后实体化视图是否增量刷新。
select mv_name, status, start_time, end_time
from SYS_MV_REFRESH_HISTORY
where mv_name='customer_mv'
order by start_time DESC;

20. 验证实体化视图中的数据是否反映了数据从 999999999 更改为了 111111111。
select * from customer_mv;

基于 Apache Iceberg 数据湖表的实体化视图增量刷新
Apache Iceberg 是一种数据湖开放式表格式,其迅速发展成为管理数据湖中数据的一种表格式行业标准。Iceberg 引入了许多新功能,有助于多个应用程序基于事务一致性的方式协同处理相同的数据。
在此章节中,我们将探讨如何将 Amazon Redshift 与 Apache Iceberg 无缝集成。我们可以利用此集成构建实体化视图,并以经济高效的方法增量刷新实体化视图,从而保持其存储数据的新鲜度。
- 登录AWS 管理控制台,前往 Amazon Athena 控制台,然后执行以下 SQL 在 AWS Glue 目录中创建数据库。
create database iceberg_mv_demo;

2. 创建一个 Iceberg 表。
create table iceberg_mv_demo.category (
catid int ,
catgroup string ,
catname string ,
catdesc string)
PARTITIONED BY (catid, bucket(16,catid))
LOCATION 's3://<your-s3-bucket-name>/iceberg/'
TBLPROPERTIES (
'table_type'='iceberg',
'write_compression'='snappy',
'format'='parquet');

3. 将一些示例数据添加到 iceberg_mv_demo.category。
insert into iceberg_mv_demo.category values
(1, 'Sports', 'MLB', 'Major League Basebal'),
(2, 'Sports', 'NHL', 'National Hockey League'),
(3, 'Sports', 'NFL', 'National Football League'),
(4, 'Sports', 'NBA', 'National Basketball Association'),
(5, 'Sports', 'MLS', 'Major League Soccer');
4. 验证 iceberg_mv_demo.category 中的示例数据。
select * from iceberg_mv_demo.category;

5. 使用 Query Editor v2 连接到你的 Amazon Redshift Serverless 工作组或 Redshift 预配集群。
6. 创建外部 Schema。
CREATE external schema iceberg_schema
from data catalog
database 'iceberg_mv_demo'
region 'us-east-1'
iam_role default;

7. 通过 Amazon Redshift 查询 Iceberg 表数据。
SELECT * FROM "dev"."iceberg_schema"."category";

8. 使用前面步骤创建的外部 Schema 创建实体化视图。
create MATERIALIZED view mv_category as
select * from
"dev"."iceberg_schema"."category";

9. 验证实体化视图中的数据。
select * from
"dev"."iceberg_schema"."category";

10. 使用 Amazon Athena 修改 Iceberg 表 iceberg_mv_demo.category,在其中插入示例数据。
insert into category values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances'),
(13, 'Concerts', 'Other', 'General');

11. 使用 Query Editor v2 刷新实体化视图 mv_category。
Refresh MATERIALIZED view mv_category;
12. 验证在 Iceberg 表中添加了额外数据后实体化视图是否增量刷新。
select mv_name, status, start_time, end_time
from SYS_MV_REFRESH_HISTORY
where mv_name='mv_category'
order by start_time DESC;

13. 使用 Amazon Athena 修改 Iceberg 表 iceberg_mv_demo.category,删除和更新表中的某些数据记录。
delete from iceberg_mv_demo.category
where catid = 3;
update iceberg_mv_demo.category
set catdesc= 'American National Basketball Association'
where catid=4;
14. 验证 iceberg_mv_demo.category 中的示例数据,确认 catid=4 已更新,catid=3 已从表中删除。
select * from iceberg_mv_demo.category;

15. 使用 Query Editor v2 刷新实体化视图 mv_category。
Refresh MATERIALIZED view mv_category;
16. 验证更新和删除数据条目后实体化视图是否增量刷新。
select mv_name, status, start_time, end_time
from SYS_MV_REFRESH_HISTORY
where mv_name='mv_category'
order by start_time DESC;

性能提升
为了解相较于完全重新计算(全量刷新),增量刷新能带来多大的性能提升,我们使用了行业标准的 TPC-DS 基准测试。我们的测试数据是包含 3 TB 数据集的 Iceberg 表,并且将 Iceberg 表配置为写时复制。我们将基准测试使用的事实表存储在 Amazon S3 上,维度表存储在 Redshift 中。我们在一个包含 4 个节点、规格为 ra3.4xl 的 Redshift 预配集群中,创建了 34 个实体化视图。每个实体化视图代表不同的客户使用用例。我们在 store_sales、catalog_sales 和 web_sales 等事实表中插入 1% 的新数据和删除 1% 的数据。数据插入和删除操作均在 EMR Serverless 上使用 Spark SQL 完成。我们使用增量刷新方式对所有 34 个实体化视图进行了刷新,并测量了刷新延迟时间。然后,使用完全重新计算方法进行了全量刷新测试。
实验结果表明,使用增量刷新方法相比于使用完全重新计算方法,性能有显著提升。插入数据后,增量刷新比完全重新计算刷新的速度平均快 13.5 倍(最高 43.8 倍,最低 1.8 倍)。删除数据后,增量刷新比完全重新计算刷新的速度平均快 15 倍(最高 47 倍,最低 1.2 倍)。下图分别展示了每个表中数据插入和数据删除后,增量刷新和完全重新计算刷新的延迟对比。
插入

删除

清理资源
完成实验后,请务必删除不再使用的资源,以避免持续产生费用。
- 运行以下脚本,清理 Amazon Redshift 对象。
DROP MATERIALIZED view mv_category;
DROP MATERIALIZED view customer_mv;
2. 使用 Amazon Athena 运行以下脚本清理 Apache Iceberg 表。
DROP TABLE iceberg_mv_demo.category;
总结
Amazon Redshift 的实体化视图可以作为一个强大的优化工具。通过 Amazon Redshift 提供的数据湖表实体化视图增量刷新功能,可以存储一个或多个基表的预先计算查询结果,从而以经济高效的方法维护数据新鲜度。我们建议你更新你的数据湖工作负载,使用实体化视图增量刷新功能。如果你不了解如何使用 Amazon Redshift,请参阅入门教程,并使用免费试用配额创建和预配你的第一个集群来试用其功能。
了解更多注意事项和最佳实践,请参阅 Materialized views on external data lake tables in Amazon Redshift Spectrum(通过 Amazon Redshift Spectrum 实现外部数据湖表的实体化视图)。
更多教程
快速搭建容量高达 35GB 的免费个人网盘
本教程将介绍如何搭建一个没有使用限制的免费私人网盘。
构建企业专属智能客服机器人
本文将演示如何结合多种服务,打造企业专属的智能客服。
使用生成式 AI 构建多语言问答知识库
使用多种服务,构建可汇总搜索结果的多语言知识库。
免费套餐
AWS 海外区域
拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月
AWS 中国区域
发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月