在 Unity 目录中,外部表将其数据文件存储在云租户中的云对象存储中。 Unity 目录继续管理表的元数据,确保跨所有查询进行完整的数据治理。 但是,它不管理数据的生命周期、优化、存储位置或布局。
定义 Unity 目录外部表时,必须指定存储位置。 此位置是在 Unity 目录中注册的 外部位置。 删除外部表时,Unity 目录会删除表元数据,但不删除基础数据文件。
本文重点介绍 Unity Catalog 外部表。 旧 Hive 元存储中的外部表具有不同的行为。 请参阅旧 Hive 元存储中的数据库对象。
何时使用外部表
Databricks 建议对以下用例使用外部表:
- 需要注册的表必需由与 Unity Catalog 托管的表不兼容的现有数据支持。
- 还需要从不支持其他外部访问模式的非 Databricks 客户端直接访问数据。 当用户从外部系统访问数据文件时,不会强制实施 Unity Catalog 特权。 请参阅使用外部系统来访问 Databricks 数据。
在大多数情况下,Databricks 建议使用 Unity 目录托管表 来利用自动表优化、更快的查询性能和降低成本。 若要将外部表迁移到托管表,请参阅 将外部表转换为托管 Unity 目录表。
重要
如果使用非 Databricks 客户端或从 Databricks 内部通过路径访问来更新外部表元数据,则这些元数据不会自动同步到 Unity Catalog 的状态。 Databricks 建议不要进行此类元数据更新,但如果执行了更新,则必须运行 MSCK REPAIR TABLE <table-name> SYNC METADATA 才能使 Unity 目录中的架构处于最新状态。 请参阅 REPAIR TABLE。
外部表的文件格式
外部表可以使用以下文件格式:
- 德尔塔
- CSV
- JSON
- AVRO
- 拼花地板
- ORC(光学字符识别)
- 文本
创建外部表
可以通过使用 SQL 命令或 DataFrame 写入操作来创建外部表。
准备工作
在创建外部表之前,必须先配置授予对云存储的访问权限的外部位置。
有关配置外部位置的详细信息,请参阅创建外部位置以将云存储连接到 Azure Databricks。
若要创建外部表,你必须满足以下权限要求:
- 对外部位置的
CREATE EXTERNAL TABLE权限,授予对外部表所访问的LOCATION的访问权限。 - 对表的父目录的
USE CATALOG权限。 - 对表的父架构的
USE SCHEMA权限。 - 对表的父架构的
CREATE TABLE权限。
注释
当 S3 外部位置与多个元存储相关联时,请避免向使用该 S3 位置的表授予写入访问权限,因为从不同元存储写入同一外部表可能会导致一致性问题。 但是,跨多个元存储从同一 S3 外部位置读取是安全的。
SQL 命令示例
在笔记本或 SQL 查询编辑器中使用以下命令示例之一来创建外部表。
在以下示例中,替换占位符值:
-
<catalog>:将包含表的目录的名称。 -
<schema>:将包含该表的架构的名称。 -
<table-name>:表的名称。 -
<column-specification>:每列的名称和数据类型。 -
<bucket-path>:要在其中创建表的云存储存储桶的路径。 -
<table-directory>:将在其中创建表的目录。 为每个表使用唯一目录。
ADLS
CREATE TABLE <catalog>.<schema>.<table-name>
(
<column-specification>
)
LOCATION 'abfss://<bucket-path>/<table-directory>';
S3
CREATE TABLE <catalog>.<schema>.<table-name>
(
<column-specification>
)
LOCATION 's3://<bucket-path>/<table-directory>';
有关表创建参数的详细信息,请参阅 CREATE TABLE。
DataFrame 写入操作
还可以从查询结果或 DataFrame 写入操作中创建外部表。
LOCATION使用子句在创建具有 DataFrame 的表时指定外部存储路径。
以下 SQL 语法选项适用于 DataFrame 操作:
删除外部表
若要删除表,必须是表的所有者或具有该表的 MANAGE 特权。 若要删除外部表,请运行以下 SQL 命令:
DROP TABLE IF EXISTS catalog_name.schema_name.table_name;
删除外部表时,Unity Catalog 不会删除云存储中的基础数据。 如果需要移除与表关联的数据,则必须直接删除基础数据文件。
示例笔记本:创建外部表
可以使用以下示例笔记本创建目录、架构和外部表,并管理对它们的权限。