本文介绍如何在启用了 Unity Catalog 的 Azure Databricks 工作区中继续使用旧版每工作区 Hive 元存储。
如果你的工作区在启用 Unity Catalog 之前已经投入使用,那么它可能有一个内置的 Hive 元存储,其中包含你可能想继续使用的数据。 本文介绍如何继续使用在 Hive 元存储中注册的表。
重要
每个工作区的 Hive 元数据存储是一个遗留功能,本文中所提供的说明代表遗留工作流程。
Hive 元存储中的表无法享有 Unity Catalog 提供的一整套安全和治理功能,例如内置审核、世系和访问控制。 Databricks 推荐将这些表及引用它们的工作负载迁移到 Unity Catalog,并禁用对 Hive 元存储的直接访问。
有两个迁移路径可用:
将 Hive 元存储中注册的所有表迁移到 Unity Catalog。 请参阅将 Hive 表和视图升级到 Unity Catalog 和使用 UCX 实用工具将工作区升级到 Unity Catalog。
请使用 Hive 元存储联合功能,将 Hive 元存储逐步迁移到 Unity Catalog,以实现更平稳地迁移。 Hive 元存储联合功能会在 Unity Catalog 中创建一个外部目录,用于镜像 Hive 元存储。
在 Unity Catalog 中查询 Hive 元存储
Unity Catalog 元存储是累加性的,这意味着它可以与 Azure Databricks 中的每工作区 Hive 元存储一起使用。 Hive 元存储在三级命名空间中显示为名为 hive_metastore
的顶级目录。
例如,可使用以下表示法引用旧式 Hive 元存储的 sales_raw
架构中名为 sales
的表:
SQL
SELECT * from hive_metastore.sales.sales_raw;
Python语言
display(spark.table("hive_metastore.sales.sales_raw"))
R
library(SparkR)
display(tableToDF("hive_metastore.sales.sales_raw"))
Scala(编程语言)
display(spark.table("hive_metastore.sales.sales_raw"))
还可使用 USE
语句指定目录和架构:
SQL
USE hive_metastore.sales;
SELECT * from sales_raw;
Python语言
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
R
library(SparkR)
sql("USE hive_metastore.sales")
display(tableToDF("sales_raw"))
Scala(编程语言)
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
与旧版 Hive 元存储相比,Unity Catalog 中的访问控制
如果在 Hive 元存储上配置 了旧表访问控制 ,Databricks 将继续对在标准访问模式下运行的群集的 hive_metastore
目录中的数据强制实施这些访问控制。
Unity 目录访问模型与旧式访问控制略有不同:
-
元存储:Unity 目录是帐户级对象,Hive 元存储是工作区级对象。 在
hive_metastore
目录中定义的权限始终指向工作区中的本地用户和组。 - 帐户组:Unity Catalog 中的访问控制策略将应用于帐户组,而 Hive 元存储的访问控制策略将应用于工作区本地组。 请参阅 组源。
- 对目录或架构内对象的所有操作都需要对该目录和架构拥有
USE CATALOG
和USE SCHEMA
权限:无论主体对表的特权如何,主体还必须对其父目录拥有 特权才能访问架构,并且必须拥有USE CATALOG
特权才能访问架构中的对象。 另一方面,使用工作区级别的表访问控制时,授予对根目录的USAGE
会自动授予对所有数据库的USAGE
,但对根目录的USAGE
不是必需的。 - 视图:在 Unity Catalog 中,视图的所有者无需是视图所引用的表和视图的所有者。 拥有
SELECT
特权,同时对视图的父架构拥有USE SCHEMA
特权并对父目录拥有USE CATALOG
特权便已足够。 使用工作区级别的表访问控制时,视图的所有者需要是所有引用的表和视图的所有者。 - 不支持
ANY FILE
或ANONYMOUS FUNCTION
:在 Unity Catalog 中,不存在可能允许非特权用户运行特权代码的ANY FILE
或ANONYMOUS FUNCTION
安全对象概念。 -
DENY
不支持 :Unity Catalog 特权模型基于最小特权原则构建。 系统默认拒绝未授予的特权。 - 无
READ_METADATA
特权:Unity Catalog 以另一方式管理查看元数据所需的访问权限。 请参阅 Unity Catalog 特权和安全对象。
Unity Catalog 对象与 Hive 元存储对象之间的联接
使用三级命名空间表示法,可以联接 Unity Catalog 元存储中的数据和旧式 Hive 元存储中的数据。
注意
与旧式 Hive 元存储区中的数据的联接将仅在该数据所在的工作区上有效。 尝试在另一个工作区中运行此类联接会导致错误。 Azure Databricks 建议将旧式表和视图升级到 Unity Catalog。
当 sales_current
字段相等时,以下示例将旧式 Hive 元存储中的 sales_historical
表的结果与 Unity Catalog 元存储中的 order_id
表的结果联接。
SQL
SELECT * FROM hive_metastore.sales.sales_current
JOIN main.shared_sales.sales_historical
ON hive_metastore.sales.sales_current.order_id = main.shared_sales.sales_historical.order_id;
Python语言
dfCurrent = spark.table("hive_metastore.sales.sales_current")
dfHistorical = spark.table("main.shared_sales.sales_historical")
display(dfCurrent.join(
other = dfHistorical,
on = dfCurrent.order_id == dfHistorical.order_id
))
R
library(SparkR)
dfCurrent = tableToDF("hive_metastore.sales.sales_current")
dfHistorical = tableToDF("main.shared_sales.sales_historical")
display(join(
x = dfCurrent,
y = dfHistorical,
joinExpr = dfCurrent$order_id == dfHistorical$order_id))
Scala(编程语言)
val dfCurrent = spark.table("hive_metastore.sales.sales_current")
val dfHistorical = spark.table("main.shared_sales.sales_historical")
display(dfCurrent.join(
right = dfHistorical,
joinExprs = dfCurrent("order_id") === dfHistorical("order_id")
))
默认目录
为为 Unity Catalog 启用的每个工作区配置默认目录。
如果在执行数据操作时省略顶级目录名称,则会采用默认目录。
最初为工作区配置的默认目录取决于为 Unity Catalog 启用工作区时的方式:
- 如果工作区是自动启用 Unity Catalog 的,工作区目录便被设置为默认目录。 请参阅自动启用 Unity Catalog。
- 如果是手动为 Unity Catalog 启用工作区,则将
hive_metastore
目录设置为默认目录。
如果要在现有工作区中从 Hive 元存储转换到 Unity Catalog,则有必要使用 hive_metastore
作为默认目录,以避免影响引用了 hive 元存储的已有代码,除非你已从 Hive 元存储中完全迁移出。
若要了解如何获取和切换默认目录,请参阅管理默认目录
以群集为作用域的数据访问权限
将 Hive 元存储与 Unity Catalog 一起使用时,与群集关联的数据访问凭据用于访问 Hive 元存储数据,但不用于访问在 Unity Catalog 中注册的数据。
如果用户访问 Unity Catalog 外部的路径(例如未注册为表或外部位置的路径),则使用为群集分配的访问凭据。