内容提要
Databricks 的 Unity Catalog 托管表将数据存储在用户自有的云存储(S3、ADLS 或 GCS)中,而非平台控制存储。用户可在元存储、目录或架构层级设置托管存储位置,层级越具体优先级越高,并可用 ALTER 命令更改新表位置。数据采用 Iceberg 和 Delta 开放格式,外部工具可通过开放 API 读写,避免锁定,同时满足合规与数据驻留需求。
延伸解读
存储位置继承与覆盖机制
Unity Catalog 允许在元存储、目录或架构层级设置托管存储位置,下层自动继承上层设置。但最具体层级优先:架构位置覆盖目录,目录覆盖元存储。这意味着团队可先设一个宽泛默认位置,再为需要独立存储的团队或域覆盖。这种层级设计让物理存储布局与组织逻辑边界对齐,无需为每张表单独指定位置。
更改存储位置的实际影响
使用 ALTER CATALOG 或 ALTER SCHEMA ... SET MANAGED LOCATION 可更改新表及卷的落点,但已写入的数据仍留在原位置。因此,更改位置不会自动迁移历史数据,只影响后续新建对象。若需将现有外部表转为托管表,转换过程中数据会复制到当前解析的托管位置,从而一步到位将数据迁入目标存储。
开放格式与外部工具访问
托管表数据以 Iceberg 或 Delta 开放格式存储,外部工具如 Apache Spark、Flink、Trino、Kafka Connect 和 Snowflake 可通过 Iceberg REST Catalog 或 Unity Catalog 开放 API 读写。访问经由凭证分发和治理控制,无需复制数据,有助于保持单一事实来源。直接路径访问也可通过路径重定向和兼容模式实现,但绕过治理可能引发数据损坏风险。
合规与成本分账的物理隔离
对于需要满足 GDPR 数据隔离、区域数据驻留或按业务线分摊云成本的场景,可为特定目录或架构设置独立的托管存储位置,使物理存储边界与合规或管理边界一致。结合 Unity Catalog 的基于角色和属性的访问控制,这种物理隔离能进一步满足标准合规要求,而无需依赖平台控制的存储。
Q&A
Unity Catalog 托管表的数据到底存在哪里?是 Databricks 自己的存储还是我的云账号?
数据存储在你自己的云存储账号中,例如你的 S3 桶、ADLS 容器或 GCS 桶。Databricks 负责管理表的布局和生命周期,但底层文件位于你拥有并注册到 Unity Catalog 的存储位置,而不是 Databricks 控制的账号。
使用 Unity Catalog 托管表会被 Databricks 锁定吗?
不会。托管表使用 Iceberg 和 Delta 等开放表格式,数据保留在你拥有的云存储中。外部引擎可以通过 Iceberg REST Catalog 和 Unity Catalog 的开放 API 读写,因此数据不会被专有接口锁定。你可以像使用外部表一样自由迁入或迁出 Databricks,数据物理位置保持不变。
如何为不同团队或合规要求设置独立的存储位置?
你可以在元存储、目录或架构层级设置托管存储位置,层级越具体优先级越高:架构位置优先于目录,目录优先于元存储。这样可以为特定目录或架构指定独立的存储位置,满足数据驻留、成本归属或 GDPR 数据隔离等需求。
设置托管存储位置后,还能更改吗?现有数据会受影响吗?
可以更改。使用 ALTER CATALOG … SET MANAGED LOCATION 或 ALTER SCHEMA … SET MANAGED LOCATION 将新表指向新位置。现有表保持原位不动,只有新创建的表会落在新位置。
除了 Databricks,还有哪些工具可以读写我的托管表?
外部引擎如 Apache Spark、Trino、Flink、Kafka Connect 和 Snowflake 可以通过 Iceberg REST Catalog 和 Unity Catalog 的开放 API 读写托管表。Unity Catalog 通过开放 API 和凭证分发管理安全访问,确保治理,防止数据损坏。也支持通过路径重定向和兼容模式进行直接路径访问。
将外部表转换为托管表时,数据会放在哪里?
转换时,Databricks 会将表的数据和事务日志复制到你设置的托管存储位置(即该表所属目录或架构当前解析到的位置)。如果外部表原本在非标准位置,你可以提前设置好目标位置,让托管表落在你选择的存储中。