2. Unity Catalog基础操作

Unity Catalog 是 Databricks 平台上统一的元数据与权限治理层。理解它的对象层级,是后续做数据质量校验、血缘分析和权限审计的前提。Unity Catalog 采用严格的三级命名空间结构,并在其之上挂载一个账户级的 Metastore,形成“一个 Metastore → 多个 Catalog → 多个 Schema → 多个 Table/View”的树状层次。每个对象都有唯一的全限定名,格式为 catalog.schema.object,例如 sales_prod.retail.orders。

需要特别区分的是:Metastore 本身不参与三段式命名,它是账户级容器,负责把存储位置、权限模型和跨工作区的元数据统一起来。一个 Databricks 账户在一个区域(region)内通常只挂载一个 Unity Catalog Metastore,多个工作区可以共享同一个 Metastore,从而共享同一套 Catalog 与权限。Catalog 是数据域或环境的第一层隔离边界,常见做法是按环境(dev/prod)或按业务域(sales/marketing)划分。Schema 在旧概念中常被称为 Database,是表与视图的直接容器,也是权限授予最常用的粒度。Table 与 View 是最终被查询的对象,其中 Table 有物理数据,View 只保存查询定义。

Unity Catalog 对象层级与命名空间 Metastore(账户级) 区域唯一 · 跨工作区共享 · 不参与三段命名 Catalog: dev 开发环境隔离边界 Catalog: sales_prod 生产业务域 Catalog: marketing 营销业务域 Schema: retail 零售主题 Schema: finance 财务主题 Schema: raw 原始接入层 Table: orders 物理数据 Table: customers 物理数据 View: v_orders_clean 仅保存查询定义 全限定名(三段式): sales_prod.retail.orders = Catalog . Schema . Table/View 权限继承方向: Metastore → Catalog → Schema → Table/View,上层授权自动向下继承,下层可单独覆盖。

用 SQL 创建与管理对象

Unity Catalog 的对象都可以用标准 SQL DDL 创建。下面是一段可直接在 Databricks SQL Warehouse 或 Notebook 中执行的示例,演示从 Catalog 到 View 的完整创建链路。示例中的名称与路径均为教学假设,实际使用时需替换为你的存储位置。

-- 1. 创建 Catalog(需在 Metastore 已挂载的前提下)
CREATE CATALOG IF NOT EXISTS sales_prod
  COMMENT '销售生产域';

-- 2. 在 Catalog 下创建 Schema
CREATE SCHEMA IF NOT EXISTS sales_prod.retail
  COMMENT '零售主题数据';

-- 3. 创建托管表(Managed Table)
CREATE TABLE IF NOT EXISTS sales_prod.retail.orders (
  order_id     BIGINT,
  customer_id  BIGINT,
  order_ts     TIMESTAMP,
  amount       DECIMAL(12,2),
  status       STRING
)
COMMENT '订单明细表';

-- 4. 创建视图,只保存查询定义
CREATE OR REPLACE VIEW sales_prod.retail.v_orders_clean AS
SELECT order_id, customer_id, order_ts, amount
FROM sales_prod.retail.orders
WHERE status = 'PAID' AND amount > 0;

-- 5. 查看层级与元数据
SHOW CATALOGS;
SHOW SCHEMAS IN sales_prod;
SHOW TABLES IN sales_prod.retail;
DESCRIBE EXTENDED sales_prod.retail.orders;

执行 SHOW CATALOGS 会列出当前 Metastore 下所有 Catalog;SHOW SCHEMAS IN sales_prod 列出该 Catalog 下的 Schema;SHOW TABLES IN sales_prod.retail 则同时返回表和视图,并通过 isTemporary 等字段区分类型。DESCRIBE EXTENDED 会输出表的存储位置、表类型(MANAGED / EXTERNAL)、创建者、所有者等治理信息,这些字段在后续做元数据审计时非常关键。

用 Catalog Explorer 进行可视化操作

Catalog Explorer 是 Databricks 工作区左侧导航中的图形化入口,适合不写 SQL 也能完成对象浏览与创建。进入后可以看到一棵可展开的树:顶层是当前 Metastore 下的 Catalog 列表,展开某个 Catalog 会显示其 Schema,再展开 Schema 会显示 Table 与 View。点击任意对象,右侧会展示 Overview、Sample Data、Details、Permissions、Lineage 等标签页。

在 Catalog Explorer 中创建对象的典型路径是:点击 Create 按钮,选择 Catalog、Schema 或 Table。创建 Table 时可以选择从文件上传、从已有表复制结构,或直接写 SQL。创建完成后,可以在 Permissions 标签页直接授予 USE CATALOG、USE SCHEMA、SELECT、MODIFY 等权限,无需手写 GRANT 语句。Lineage 标签页会展示该表上下游的读写关系,这是排查数据质量问题来源时最直观的工具之一。

Catalog Explorer 与 SQL 操作的是同一套元数据。在 Explorer 中创建的对象,用 SHOW TABLES 立刻可见;反之亦然。两者只是交互方式不同,不存在数据不一致的问题。

层级关系带来的三个实践要点

  • 命名必须完整。在 Unity Catalog 中查询表时,推荐始终使用三段式全限定名。虽然可以通过 USE CATALOG 和 USE SCHEMA 设置当前上下文后使用短名,但在跨团队协作和作业调度中,全限定名能避免歧义。
  • 权限按层级继承。在 Catalog 上授予 USE CATALOG,其下所有 Schema 都可见;在 Schema 上授予 SELECT,其下所有表都可读。因此授权时应遵循最小权限原则,优先在 Schema 粒度授予,必要时再细化到表。
  • View 与 Table 的治理差异。View 不存储数据,其权限校验会同时检查 View 定义本身和底层表的访问权限。若用户能查 View 但无权访问底层表,查询仍会失败。这一点在做数据脱敏视图时尤其需要注意。
删除 Catalog 会级联影响其下所有 Schema 和表,且托管表的数据可能一并被清理。生产环境中执行 DROP CATALOG ... CASCADE 前,务必确认没有下游作业依赖,并优先使用 RESTRICT 做保护性删除。