查询 Linux Foundation Delta Lake 表 - Amazon Athena

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

查询 Linux Foundation Delta Lake 表

Linux Foundation Delta Lake 是一种用于大数据分析的表格格式。您可以使用 Amazon Athena 直接读取存储在 Amazon S3 中的 Delta Lake 表,无需生成清单文件或运行 MSCK REPAIR 语句。

Delta Lake 格式会存储每个数据文件每列的最小值和最大值。Athena 实施利用该信息在谓词上启用文件跳过,以消除不需要的文件。

注意事项和限制

Athena 中的 Delta Lake 支持具有以下限制:

  • 仅包含 AWS Glue 目录的表 – 仅通过注册到 AWS Glue 的表支持原生 Delta Lake。如果 Delta Lake 表已注册到其他元存储,您仍可保留该表并将其视为主元存储。由于 Delta Lake 元数据存储在文件系统(例如 Amazon S3)中而不是元存储中,因此 Athena 只需 AWS Glue 中的位置属性即可从 Delta Lake 表中进行读取。

  • V3 engine only(仅限 V3 引擎)– 仅支持在 Athena 引擎版本 3 上进行 Delta Lake 查询。您必须确保创建的工作组配置为使用 Athena 引擎版本 3。

  • No time travel support(不支持时间旅行)– 不支持使用 Delta Lake 时间旅行功能的查询。

  • Read only(只读)– 不支持编写 UPDATEINSERT、或 DELETE 等 DML 语句。

  • Lake Formation 支持 – Lake Formation 集成可用于架构与 AWS Glue 同步的 Delta Lake 表。有关更多信息,请参阅《AWS Lake Formation 开发人员指南》中的 AWS Lake Formation 与 Amazon Athena 一起使用为 Delta Lake 表设置权限

  • Limited DDL support(有限的 DDL 支持)– 支持以下 DDL 语句:CREATE EXTERNAL TABLESHOW COLUMNSSHOW TBLPROPERTIESSHOW PARTITIONSSHOW CREATE TABLEDESCRIBE。有关使用 CREATE EXTERNAL TABLE 语句的信息,请参阅 开始使用 一节。

  • 不支持跳过 S3 Glacier 对象 – 如果 Linux Foundation Delta Lake 表中的对象属于 Amazon S3 Glacier 存储类,将 read_restored_glacier_objects 表属性设置为 false 则无效。

    例如,假设发出以下命令:

    ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')

    对于 Iceberg 和 Delta Lake 表,该命令会生成错误 Unsupported table property key: read_restored_glacier_objects。对于 Hudi 表,ALTER TABLE 命令不会产生错误,但是 Amazon S3 Glacier 对象仍无法跳过。在 ALTER TABLE 命令之后运行 SELECT 查询会继续返回所有对象。

支持的非分区列数据类型

对于非分区列,除 CHAR 外,支持 Athena 支持的所有数据类型(Delta Lake 协议本身不支持 CHAR)。支持的数据类型包括:

boolean tinyint smallint integer bigint double float decimal varchar string binary date timestamp array map struct

支持的分区列数据类型

对于分区列,Athena 支持具有以下数据类型的表:

boolean integer smallint tinyint bigint decimal float double date timestamp varchar

有关 Athena 中数据类型的更多信息,请参阅 Amazon Athena 中的数据类型

开始使用

要进行查询,Delta Lake 表必须存在于 AWS Glue 中。如果表位于 Amazon S3 但不在 AWS Glue 中,请使用以下语法运行 CREATE EXTERNAL TABLE 语句。如果表已存在于 AWS Glue 中(例如,因为您正在将 Apache Spark 或其他引擎与 AWS Glue 结合使用),则可以跳过此步骤。

CREATE EXTERNAL TABLE [db_name.]table_name LOCATION 's3://DOC-EXAMPLE-BUCKET/your-folder/' TBLPROPERTIES ('table_type' = 'DELTA')

请注意省略了列定义、 SerDe 库和其他表属性。与传统的 Hive 表不同,Delta Lake 表元数据是从 Delta Lake 事务日志中推断出来的,并直接同步到 AWS Glue。

注意

对于 Delta Lake 表,不允许包含除 LOCATIONtable_type 属性外的 CREATE TABLE 语句。

读取 Delta Lake 表

要查询 Delta Lake 表,请使用标准 SQL SELECT 语法:

[ WITH with_query [, ...] ]SELECT [ ALL | DISTINCT ] select_expression [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ] [ HAVING condition ] [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ] [ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ] [ OFFSET count [ ROW | ROWS ] ] [ LIMIT [ count | ALL ] ]

有关 SELECT 语句的更多信息,请参阅 Athena 文档中的 SELECT

Delta Lake 格式会存储每个数据文件每列的最小值和最大值。Athena 利用该信息在谓词上启用文件跳过,以消除不需要的文件。

同步 Delta Lake 元数据

如果您使用 Athena 创建 Delta Lake 表,Athena 会将表元数据(包括架构、分区列和表属性)同步到 AWS Glue。随着时间推移,该元数据可能会中断与事务日志中基础表元数据的同步。要让表保持最新状态,您可以选择以下选项之一:

请注意:以下功能要求您的 AWS Glue 架构始终具有与事务日志相同的架构:

  • Lake Formation

  • 视图

  • 行和列筛选器

如果您的工作流程不需要任何此功能,并且您不希望保持这种兼容性,则可以在 Athena 中使用 CREATE TABLE DDL,然后将 Amazon S3 路径作为参数添加到中。 SerDe AWS Glue

使用 Athena 和 AWS Glue 控制台创建 Delta Lake 表
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 在 Athena 查询编辑器中,使用以下 DDL 创建您的 Delta Lake 表。请注意:使用此方法时,TBLPROPERTIES 的值必须为 'spark.sql.sources.provider' = 'delta',而不是 'table_type' = 'delta'

    请注意:当您使用 Apache Spark(Athena for Apache Spark)或大多数其他引擎创建表时,会插入相同的架构(其中包含一个名为 colarray<string> 类型列)。

    CREATE EXTERNAL TABLE [db_name.]table_name(col array<string>) LOCATION 's3://DOC-EXAMPLE-BUCKET/your-folder/' TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
  3. 通过 https://console.aws.amazon.com/glue/ 打开 AWS Glue 控制台。

  4. 在导航窗格中,选择数据目录

  5. 在表的列表中,选择表的链接。

  6. 在表格页面上,选择操作编辑表格

  7. Serde 参数部分,添加带有值 s3://DOC-EXAMPLE-BUCKET/your-folder/ 的键 path

  8. 选择保存

另请参阅

有关将 Delta Lake 表与 AWS Glue 一起使用以及使用 Athena 查询表的讨论,请参阅 AWS 大数据博客中的使用开源 Delta Lake 和 AWS Glue 处理 UPSERT 数据操作