使用 Unity Catalog 和旧式 Hive 元存储
本文介绍如何在为 Unity Catalog 启用了 Azure Databricks 工作区时使用按工作区的 Hive 元存储。
如果你的工作区在启用 Unity Catalog 之前处于服务中状态,则它可能有一个 Hive 元存储,其中包含你要继续使用的数据。 Databricks 建议将 Hive 元存储管理的表迁移到 Unity Catalog 元存储,但如果你不迁移,可以按照本文所述处理这两个元存储管理的数据。
在 Unity Catalog 中查询 Hive 元存储
Unity Catalog 元存储是累加性的,这意味着它可以与 Azure Databricks 中的每工作区 Hive 元存储一起使用。 Hive 元存储在三级命名空间中以 hive_metastore
名称作为顶级目录显示。
例如,可使用以下表示法引用旧式 Hive 元存储的 sales
架构中名为 sales_raw
的表:
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"))
Unity Catalog 和 Hive 元存储中的访问控制
如果在 Hive 元存储上配置了表访问控制,Databricks 将继续对在共享访问模式下运行的群集的 hive_metastore
目录中的数据强制实施这些访问控制。 Unity Catalog 访问模型与旧版访问控制略有不同,例如,没有 DENY
语句。 Hive 元存储是工作区级对象。 在 hive_metastore
目录中定义的权限始终指向工作区中的本地用户和组。 请参阅与表访问控制的差异。
与表访问控制的差异
Unity Catalog 与在每个工作区中使用旧式 Hive 元存储中的表访问控制存在以下重要差异。
Unity Catalog 中的访问控制模型与表访问控制存在以下差异:
- 帐户组:Unity Catalog 中的访问控制策略将应用于帐户组,而 Hive 元存储的访问控制策略将应用于工作区本地组。 请参阅帐户组和工作区本地组之间的区别。
- 对目录或架构内对象的所有操作都需要对该目录和架构拥有
USE CATALOG
和USE SCHEMA
权限:无论主体对表的特权如何,主体还必须对其父目录拥有USE CATALOG
特权才能访问架构,并且必须拥有USE SCHEMA
特权才能访问架构中的对象。 另一方面,使用工作区级别的表访问控制时,授予对根目录的USAGE
会自动授予对所有数据库的USAGE
,但对根目录的USAGE
不是必需的。 - 视图:在 Unity Catalog 中,视图的所有者无需是视图所引用的表和视图的所有者。 拥有
SELECT
特权,同时对视图的父架构拥有USE SCHEMA
特权并对父目录拥有USE CATALOG
特权便已足够。 使用工作区级别的表访问控制时,视图的所有者需要是所有引用的表和视图的所有者。 - 不支持
ANY FILE
或ANONYMOUS FUNCTION
:在 Unity Catalog 中,不存在可能允许非特权用户运行特权代码的ANY FILE
或ANONYMOUS FUNCTION
安全对象概念。 - 无
READ_METADATA
特权:Unity Catalog 以另一方式管理查看元数据所需的访问权限。 请参阅 Unity Catalog 特权和安全对象。
Unity Catalog 对象与 Hive 元存储对象之间的联接
使用三级命名空间表示法,可以联接 Unity Catalog 元存储中的数据和旧式 Hive 元存储中的数据。
注意
与旧式 Hive 元存储区中的数据的联接将仅在该数据所在的工作区上有效。 尝试在另一个工作区中运行此类联接会导致错误。 Azure Databricks 建议将旧式表和视图升级到 Unity Catalog。
当 order_id
字段相等时,以下示例将旧式 Hive 元存储中的 sales_current
表的结果与 Unity Catalog 元存储中的 sales_historical
表的结果联接。
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 元存储与 Unity Catalog 一起使用时,与群集关联的数据访问凭据用于访问 Hive 元存储数据,但不用于访问在 Unity Catalog 中注册的数据。
如果用户访问 Unity Catalog 外部的路径(例如未注册为表或外部位置的路径),则使用为群集分配的访问凭据。
请参阅连接到 Azure Data Lake Storage Gen2 和 Blob 存储。
将旧表升级到 Unity Catalog
Hive 元存储中的表无法受益于 Unity Catalog 引入的一整套安全和治理功能,如内置的审核和访问控制。 Databricks 建议将旧表添加到 Unity Catalog 来升级旧表。