本文介绍如何在为 Unity Catalog 启用了 Azure Databricks 工作区时使用按工作区的 Hive 元存储。
如果你的工作区在启用 Unity Catalog 之前处于服务中状态,则它可能有一个 Hive 元存储,其中包含你要继续使用的数据。 Databricks 建议将 Hive 元存储管理的表迁移到 Unity Catalog 元存储,但如果你不迁移,可以按照本文所述处理这两个元存储管理的数据。
Unity Catalog 元存储是累加性的,这意味着它可以与 Azure Databricks 中的每工作区 Hive 元存储一起使用。 Hive 元存储在三级命名空间中以 hive_metastore
名称作为顶级目录显示。
例如,可使用以下表示法引用旧式 Hive 元存储的 sales
架构中名为 sales_raw
的表:
SELECT * from hive_metastore.sales.sales_raw;
display(spark.table("hive_metastore.sales.sales_raw"))
library(SparkR)
display(tableToDF("hive_metastore.sales.sales_raw"))
display(spark.table("hive_metastore.sales.sales_raw"))
还可使用 USE
语句指定目录和架构:
USE hive_metastore.sales;
SELECT * from sales_raw;
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
library(SparkR)
sql("USE hive_metastore.sales")
display(tableToDF("sales_raw"))
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
如果在 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 元存储中的数据。
注意
与旧式 Hive 元存储区中的数据的联接将仅在该数据所在的工作区上有效。 尝试在另一个工作区中运行此类联接会导致错误。 Azure Databricks 建议将旧式表和视图升级到 Unity Catalog。
当 order_id
字段相等时,以下示例将旧式 Hive 元存储中的 sales_current
表的结果与 Unity Catalog 元存储中的 sales_historical
表的结果联接。
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;
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
))
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))
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 存储。
Hive 元存储中的表无法受益于 Unity Catalog 引入的一整套安全和治理功能,如内置的审核和访问控制。 Databricks 建议将旧表添加到 Unity Catalog 来升级旧表。