使用 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 CATALOGUSE SCHEMA 权限:无论主体对表的特权如何,主体还必须对其父目录拥有 USE CATALOG 特权才能访问架构,并且必须拥有 USE SCHEMA 特权才能访问架构中的对象。 另一方面,使用工作区级别的表访问控制时,授予对根目录的 USAGE 会自动授予对所有数据库的 USAGE,但对根目录的 USAGE 不是必需的。
  • 视图:在 Unity Catalog 中,视图的所有者无需是视图所引用的表和视图的所有者。 拥有 SELECT 特权,同时对视图的父架构拥有 USE SCHEMA 特权并对父目录拥有 USE CATALOG 特权便已足够。 使用工作区级别的表访问控制时,视图的所有者需要是所有引用的表和视图的所有者。
  • 不支持 ANY FILEANONYMOUS FUNCTION:在 Unity Catalog 中,不存在可能允许非特权用户运行特权代码的 ANY FILEANONYMOUS 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 来升级旧表