Unity Catalog 控制经过 Unity Catalog 但不管理数据生命周期、优化、存储位置或布局的所有查询的外部数据访问权限。
外部表将数据存储在云租户的云对象存储中的目录中。 定义外部表时,必须指定存储位置。 删除外部表时,不会删除数据文件。
创建外部表时,可以将现有数据文件目录注册为表,也可以提供用于创建存储表的数据文件的新目录的路径。
Databricks 建议对以下用例使用外部表:
- 需要注册的表必需由与 Unity Catalog 托管的表不兼容的现有数据支持。
- 还需要从不支持其他外部访问模式的非 Databricks 客户端直接访问数据。 请参阅使用外部系统来访问 Databricks 数据。
当用户从外部系统访问数据文件时,不会强制实施 Unity Catalog 特权。
本文重点介绍 Unity Catalog 外部表。 旧 Hive 元存储中的外部表具有不同的行为。 请参阅旧 Hive 元存储中的数据库对象。
重要
如果使用非 Databricks 客户端或从 Databricks 内部通过路径访问来更新外部表元数据,则这些元数据不会自动同步到 Unity Catalog 的状态。 Databricks 建议不要进行此类元数据更新,但如果执行了更新,则必须运行 MSCK REPAIR TABLE <table-name> SYNC METADATA
才能使 Unity 目录中的架构处于最新状态。 请参阅 REPAIR TABLE。
外部表的文件格式
外部表可以使用以下文件格式:
- 德尔塔
- CSV
- JSON(JavaScript 对象表示法)
- AVRO
- 拼花地板
- ORC(光学字符识别)
- 发短信
创建外部表
若要创建外部表,可以使用 SQL 命令或 Dataframe 写入操作。
开始之前
若要创建外部表,你必须满足以下权限要求:
- 对外部位置的
CREATE EXTERNAL TABLE
权限,授予对外部表所访问的LOCATION
的访问权限。 - 对表的父架构的
USE SCHEMA
权限。 - 对表的父目录的
USE CATALOG
权限。 - 对表的父架构的
CREATE TABLE
权限。
有关配置外部位置的详细信息,请参阅创建外部位置以将云存储连接到 Azure Databricks。
注释
在向 AWS S3 上的外部表授予访问权限时,请注意以下几点:Databricks 建议只有在外部位置已经在一个单独的元数据存储中定义时,才对 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 写入操作创建外部表。 以下文章演示了可用于在 Azure Databricks 上创建外部表的一些模式:
删除外部表
若要删除表,必须是表的所有者或具有该表的 MANAGE
特权。 若要删除外部表,请运行以下 SQL 命令:
DROP TABLE IF EXISTS catalog_name.schema_name.table_name;
删除外部表时,Unity Catalog 不会删除云存储中的基础数据。 如果需要移除与表关联的数据,则必须直接删除基础数据文件。
示例笔记本:创建外部表
可以使用以下示例笔记本创建目录、架构和外部表,并管理对它们的权限。