亚马逊AWS官方博客

Amazon S3 表类数据存储服务现在支持所有 Apache Iceberg V3 数据类型

Amazon S3 表类数据存储服务现在支持 Apache Iceberg V3 规范中的所有数据类型。您可以创建 V3 表或升级现有 V2 表,以利用 V3 功能,如删除向量、行谱系,以及变体、纳秒时间戳、未知、几何和地理位置等新数据类型。

Apache Iceberg 已成为管理大型分析数据集的开放标准。该服务让您能够管理 PB 级表,并支持模式演化、隐藏分区和时间旅行查询等功能,同时将数据以开放的 Parquet 文件形式保留在 Amazon S3 等对象存储上的数据湖中。Amazon S3 表类数据存储服务提供专为 Iceberg 表在增长时保持性能和成本效益而构建的存储,具有自动压缩、维护、复制和智能分层等完全托管的功能。

随着数据的增长,在 Apache Iceberg V2 表上运行分析的团队通常会遇到同样的限制。一项从一个 20 亿行的表中删除 5 万条用户记录的合规性请求,会留下位置删除文件,在压缩执行前会降低查询速度。半结构化事件以 JSON 字符串的形式出现,每个查询都必须解析。地理空间坐标和纳秒级精度时间戳被编码为字符串或整数。每种临时措施都会增加存储成本、查询延迟和管线代码。借助 V3,Iceberg 通过为半结构化和地理空间数据提供原生支持、更快的行级操作,以及用于数据治理的内置行谱系,解决了这些挑战。

从今天开始,Amazon S3 表类数据存储服务支持所有 V3 数据类型,包括变体、纳秒时间戳、几何、地理位置和未知数据,以及删除向量和行谱系。您可以创建新的 V3 表或升级现有的 V2 表,S3 表将继续为您运行压缩和维护。

Apache Iceberg V3
V3 是 Iceberg 规范的最新版本。在众多改进中,V3 引入了解决 V2 中最常见痛点的功能。其中包括:

删除向量用紧凑的二进制格式替换 V2 的位置删除文件。现在,5 万行的合规性删除操作会写入一个删除向量文件,而不是数千个小删除文件,从而显著减少了压缩时间和删除文件开销。

行谱系自动将 _row_id 和 _last_updated_sequence_number 添加到每条记录中。您的下游管线可以查询这些字段以查找更改的行,而无需扫描整个表。

新的数据类型允许您在本地存储半结构化、地理空间和纳秒级精度数据,而不是将其编码为字符串或整数:

  • 纳秒级精度时间戳的纳秒时间戳(tz)
  • 地理空间数据的几何和地理位置
  • 对于没有已知类型的列,则为未知

变体数据类型以列式格式存储半结构化数据。在写入过程中,引擎将变体数据拆分至隐藏列中并收集统计数据。在查询时,与解析 JSON 字符串相比,这些统计数据可以进行文件修剪,从而显著减少 I/O。

以下各部分介绍如何在实践中使用这些 V3 功能,并举例说明如何创建表、使用新数据类型和大规模管理数据。

开始使用
零售分析团队跟踪用户在 Web 和移动应用程序中的行为。每个事件都有不同的结构:页面浏览量包括 URL 和持续时间,购买量包括物品和金额,搜索包括查询词和结果数。使用 V3 的变体类型,您可以将所有事件形状存储在一个表中,无需预定义架构:

CREATE TABLE my_catalog.namespace.clickstream (
  event_id bigint,
  event_time timestamp,
  user_id string,
  payload variant
)
USING iceberg
TBLPROPERTIES ('format-version' = '3')

插入具有不同有效载荷形状的事件,无需担心架构演变:

INSERT INTO my_catalog.namespace.clickstream VALUES
  (1, current_timestamp(), 'user-42',
   PARSE_JSON('{"action": "purchase", "amount": 99.99, "items": ["laptop_stand"]}')),
  (2, current_timestamp(), 'user-17',
   PARSE_JSON('{"action": "page_view", "url": "/products/webcam", "duration_ms": 4200}'));

现在可以直接查询变体列,无需在读取时使用 PARSE_JSON。在 Amazon EMR Spark 中,使用 variant_get:

SELECT
  event_id,
  user_id,
  variant_get(payload, '$.action', 'string') AS action,
  variant_get(payload, '$.amount', 'double') AS amount
FROM my_catalog.namespace.clickstream
WHERE variant_get(payload, '$.action', 'string') = 'purchase'
  AND variant_get(payload, '$.amount', 'double') > 50.00

要为写入操作启用删除向量,请配置读取时合并模式:

ALTER TABLE my_catalog.namespace.clickstream
SET TBLPROPERTIES (
  'write.delete.mode' = 'merge-on-read',
  'write.update.mode' = 'merge-on-read',
  'write.merge.mode' = 'merge-on-read'
)

现在,当您运行合规性删除时,V3 会写入一个小的删除向量,而不是重写数据文件:

DELETE FROM my_catalog.namespace.clickstream
WHERE user_id = 'user-42'

S3 表类数据存储服务压缩会在下一个维护周期中自动处理这些删除向量文件。

从 V2 升级
AWS 为两个版本提供向后兼容性,进而最大限度地减少迁移到 V3 期间的中断。在您准备完全采用 V3 功能之前,现有的 V2 读取器将继续处理升级后的表。有关更多详细信息,请参阅 S3 表类数据存储服务 Iceberg V3 文档。
以原子方式升级现有表,无需重写数据:

ALTER TABLE my_catalog.namespace.existing_table
SET TBLPROPERTIES ('format-version' = '3')

在下一个压缩周期中,S3 表类数据存储服务会移除旧的 V2 删除文件。新的修改会自动使用删除向量。行谱系字段在升级后的第一次数据修改时初始化。

这是一种单向操作。Apache Iceberg 规范不支持从 V3 降级到 V2。升级之前,请确认所有访问该表的引擎都支持 V3。

为增量管线使用行谱系
在您的表包含 V3 数据后,使用行谱系来构建高效的增量管线:

SELECT *, _row_id, _last_updated_sequence_number
FROM my_catalog.namespace.clickstream
WHERE _last_updated_sequence_number > 42

这仅返回序列号 42 之后修改的行。您的下游作业可以在每次运行时检查此值并仅处理新的更改,而不是扫描整个表。

AWS 分析服务之间的兼容性
AWS 提供所有主要云提供商中最广泛的原生 Apache Iceberg 支持,在数据堆栈的每一层都提供与 Iceberg 兼容的服务:摄取、存储、目录和分析。您可以在 Amazon S3 表类数据存储服务中存储并自动优化 V3 表,使用 Amazon EMR Spark 写入数据,使用 AWS Glue 集成和管理数据,使用 Amazon Redshift 运行分析。要详细了解 AWS 对 V3 的分析支持,请参阅 Apache Iceberg on AWS 规范指引。

S3 表类数据存储服务和 AWS Glue Data Catalog 都支持 Iceberg REST Catalog(IRC)API,无论目录端点如何,都支持跨引擎的互操作性。

注意事项

  • S3 表类数据存储服务压缩完全支持 V3 删除向量文件并保留行谱系元数据。
  • 新的 V3 数据类型(变体、纳秒时间戳、几何、地理位置和未知)需要基于 Apache Spark 4.0 或更高版本的引擎,例如 AWS Glue 6.0 或更高版本,或 Amazon EMR 版本 8.1 或更高版本。
  • 您可以通过 Amazon S3 控制台、AWS CLI 或任何支持 Iceberg REST Catalog API 的引擎创建 V3 表。
  • 只有使用 Parquet 文件格式(不是 ORC 或 Avro)的表才支持新的 V3 数据类型。
  • 变体、几何、地理位置或纳秒时间戳类型的列不能包含在表的压缩排序顺序中。当排序顺序使用其他类型的列时,包含这些列的表在排序和 Z 顺序策略下仍然很紧凑。

现已推出
所有 Apache Iceberg V3 数据类型的 Amazon S3 表类数据存储服务支持,现已在支持 S3 表类数据存储服务的所有 AWS 区域中推出。Apache Iceberg V3 支持不收取额外费用;适用标准 S3 表类数据存储服务定价。

要开始使用,请访问 Amazon S3 表类数据存储服务文档或从 Amazon S3 控制台创建表存储桶。如果您想调用 API、搜索文档、查找区域可用性并查看有关此功能的故障排除,请尝试在首选人工智能工具中使用 AWS MCP 服务器和插件。请将反馈发送至 AWS re:Post 或通过您常用的 AWS Support 联系方式发送反馈。

– Daniel Abib