使用 Unity Catalog 和旧版 Hive 元存储

本文介绍如何在启用了 Unity Catalog 的 Azure Databricks 工作区中继续使用旧版每工作区 Hive 元存储。

如果你的工作区在启用 Unity Catalog 之前已经投入使用,那么它可能有一个内置的 Hive 元存储,其中包含你可能想继续使用的数据。 本文介绍如何继续使用在 Hive 元存储中注册的表。

重要

每个工作区的 Hive 元数据存储是一个遗留功能,本文中所提供的说明代表遗留工作流程。

Hive 元存储中的表无法享有 Unity Catalog 提供的一整套安全和治理功能,例如内置审核、世系和访问控制。 Databricks 推荐将这些表及引用它们的工作负载迁移到 Unity Catalog,并禁用对 Hive 元存储的直接访问。

有两个迁移路径可用:

另请参阅 “禁用对 Azure Databricks 工作区使用的 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 CATALOGUSE SCHEMA 权限:无论主体对表的特权如何,主体还必须对其父目录拥有 特权才能访问架构,并且必须拥有 USE CATALOG 特权才能访问架构中的对象。 另一方面,使用工作区级别的表访问控制时,授予对根目录的 USAGE 会自动授予对所有数据库的 USAGE,但对根目录的 USAGE 不是必需的。
  • 视图:在 Unity Catalog 中,视图的所有者无需是视图所引用的表和视图的所有者。 拥有 SELECT 特权,同时对视图的父架构拥有 USE SCHEMA 特权并对父目录拥有 USE CATALOG 特权便已足够。 使用工作区级别的表访问控制时,视图的所有者需要是所有引用的表和视图的所有者。
  • 不支持 ANY FILEANONYMOUS FUNCTION:在 Unity Catalog 中,不存在可能允许非特权用户运行特权代码的 ANY FILEANONYMOUS 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 外部的路径(例如未注册为表或外部位置的路径),则使用为群集分配的访问凭据。

请参阅连接到 Azure Data Lake Storage 和 Blob 存储