Delta Lake 连接器

概述

此连接器允许在 Presto 中读取 Delta Lake 表。连接器使用 Delta Lake 项目提供的 Delta 独立库 (DSR) 来读取表元数据。

配置

要配置 Delta Lake 连接器,请创建一个目录属性文件 etc/catalog/delta.properties,内容如下,根据需要替换属性

connector.name=delta
hive.metastore.uri=hostname:port

配置属性

以下配置属性可用

属性名称

描述

默认值

hive.metastore.uri

注册 Delta Lake 表的 Hive 元数据存储的 URI(s)。连接器依赖 Hive 元数据存储来查找 Delta Lake 表的位置。从给定位置的 Delta 日志中,可以找到表的模式和数据文件列表。

null

delta.parquet-dereference-pushdown-enabled

启用将嵌套列反引用推入表扫描,以便仅选择 struct 数据类型列中选择的所需字段。为了使此选项起作用,还要将 experimental.pushdown-dereference-enabled 设置为 true

true

delta.case-sensitive-partitions-enabled

允许以区分大小写的方式匹配分区列的名称。

true

Delta Lake 连接器复用 Hive 连接器中存在的许多模块。用于连接和安全性的模块(如 S3、Azure Data Lake、Glue 元数据存储等)与 Hive 连接器文档中提供的模块相同,因此这些模块的配置也相同。

查询 Delta Lake 表

示例查询

SELECT * FROM sales.apac.sales_data LIMIT 200;

在上面的查询中

  • sales 指的是 Delta Lake 目录。

  • apac 指的是 Hive 元数据存储中的数据库。

  • sales_data 指的是注册在 apac 数据库中的 Delta Lake 表。

如果表未注册在 Hive 元数据存储中,可以使用以下 DDL 命令注册。

注意

要将表注册到 Hive 元数据存储中,DDL 中不需要提供表的完整模式,因为 Delta Lake 连接器会从 Delta Lake 表位置的元数据中获取模式。为了避免 Hive 元数据存储中的“无列”错误,请提供一个虚拟列作为要注册的 Delta 表的模式。

示例

使用 Delta Lake 连接器在 apac 模式中创建一个名为 sales_data_new 的新 Delta 表,该表在名为 db-sa-datasets 的 S3 存储桶中具有 Delta Lake 表位置

CREATE TABLE sales.apac.sales_data_new (dummyColumn INT)
WITH (external_location = 's3://db-sa-datasets/presto/sales_data_new');

要将分区 Delta 表注册到 Hive 元数据存储中,请使用与上面相同的 CREATE TABLE。在属性中只需要 external_location,不需要在 CREATE TABLE 中指定 partitioned_by

另一个选择是直接使用表位置作为表名称来查询表。

SELECT * FROM sales."$path$"."s3://db-sa-datasets/presto/sales_data" LIMIT 200;

在上面的查询中,模式 $path$ 表示表名称是一个路径。作为 s3://db-sa-datasets/presto/sales_date 给出的表名称是 Delta Lake 表所在的路径。基于路径的选项允许用户在不将 Delta 表注册到 Hive 元数据存储的情况下查询 Delta 表。

要查询 Delta Lake 表的特定快照,请将快照标识符作为后缀添加到表名称。

SELECT * FROM sales.apac."sales_data@v4" LIMIT 200;

上面的查询从表 sales.apac.sales_data 的快照版本 4 中读取数据。

要查询特定时间的 Delta Lake 表的快照,请将时间戳作为后缀添加到表名称。

SELECT * FROM sales.apac."sales_data@t2021-11-18 09:45" LIMIT 200;

上面的查询从表 sales.apac.sales_data 中时间戳为 2021-11-18 09:45:00 的最新快照中读取数据。

DROP TABLE sales.apac.sales_data_new;

上面的查询会删除外部表 sales.apac.sales_data_new。这只会删除表的元数据。引用的数据目录不会被删除。