使用 Databricks-to-Databricks Delta Sharing 读取共享数据(针对接收者)

本文介绍如何读取使用 Databricks 到 Databricks Delta Sharing 协议与你共享的数据,Databricks 在该协议中管理数据共享的安全连接。 与 Delta Sharing 开放共享协议不同,Databricks 到 Databricks 协议不需要凭据文件(基于令牌的安全性)。

Databricks-to-Databricks 共享要求接收者有权访问启用了 Unity Catalog 的 Databricks 工作区。

如果你没有一个启用了 Unity Catalog 的 Databricks 工作区,则其他用户必须使用 Delta Sharing 开放共享协议来与你共享数据,并且本文不适合你阅读。 请参阅使用 Delta Sharing 开放共享读取共享的数据(针对接收者)

如何向团队提供共享的数据?

若要读取使用 Databricks 到 Databricks 协议与你共享的数据和笔记本,你必须是启用了 Unity Catalog 的 Databricks 工作区的用户。 团队的一名成员为数据提供程序提供 Unity Catalog 元存储的唯一标识符,数据提供程序使用该标识符创建与组织的安全共享连接。 然后,共享的数据会在工作区中供读取访问,数据提供者对共享表、视图、卷和分区所做的任何更新都会在工作区中准实时地反映出来。

注意

对共享数据表、视图和卷的更新会准实时地显示在工作区中。 但是,列的更改(添加、重命名、删除)可能需要在最多一分钟后才显示在目录资源管理器中。 同样,新的共享以及对共享的更新(例如向共享添加新表)需要在缓存一分钟后才可供查看和查询。

若要读取与你共享的数据:

  1. 你的团队中的某个用户查找共享(与你共享的表、视图、卷和笔记本的容器),并使用该共享创建一个目录(Databricks Unity Catalog 中所有数据的顶级容器)。
  2. 你的团队中的某个用户向其他团队成员授予或拒绝对该目录及其中的对象(架构、表、视图和卷)的访问权限。
  3. 你可以像读取 Databricks 中你对其拥有只读(SELECTREAD VOLUME)访问权限的任何其他数据资产一样,读取你有权访问的表、视图和卷中的数据。
  4. 只要你对目录拥有 USE CATALOG 特权,就可以在共享中预览和克隆笔记本。

所需的权限

若要列出和查看有关所有提供者和提供者共享的详细信息,你必须是元存储管理员或拥有 USE PROVIDER 特权。 其他用户只能访问他们拥有的提供者和共享。

若要从提供者共享创建目录,你必须是元存储管理员、对 Unity Catalog 元存储同时拥有 CREATE_CATALOGUSE PROVIDER 特权的用户,或者是拥有 CREATE_CATALOG 特权并对提供者对象拥有所有权的用户。

授予对通过共享创建的目录中的架构(数据库)、表、视图和卷的只读访问权限的能力遵循典型的 Unity Catalog 特权层次结构。 若要查看基于共享创建的目录中笔记本,需要对该目录拥有 USE CATALOG 特权。 请参阅管理 Delta Sharing 目录中架构、表和卷的权限

查看提供程序和共享

若要开始读取数据提供程序与你共享的数据,需要知道提供程序与你共享数据后,存储在 Unity Catalog 元存储中的提供程序和共享对象的名称。

提供程序对象表示与你共享数据的组织的 Unity Catalog 元存储、云平台和区域。

共享对象表示提供者与你共享的表、卷和视图。

查看与你共享了数据的所有提供程序

若要查看可用的数据提供者列表,可以使用目录资源管理器、Databricks Unity Catalog CLI,或者 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 SHOW PROVIDERS SQL 命令。

所需的权限:必须是元存储管理员或拥有 USE PROVIDER 特权。 其他用户只能访问他们拥有的提供者和提供者共享。

有关详细信息,请参阅查看提供程序

查看提供程序详细信息

若要查看有关提供者的详细信息,可以使用目录资源管理器、Databricks Unity Catalog CLI,或者 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 DESCRIBE PROVIDER SQL 命令。

所需的权限:必须是元存储管理员、拥有 USE PROVIDER 特权,或拥有提供者对象。

有关详细信息,请参阅查看提供程序详细信息

查看共享

若要查看提供者与你共享的共享,可以使用目录资源管理器、Databricks Unity Catalog CLI,或者 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 SHOW SHARES IN PROVIDER SQL 命令。

所需的权限:必须是元存储管理员、拥有 USE PROVIDER 特权,或拥有提供者对象。

有关详细信息,请参阅查看提供程序与你共享的共享

访问共享表或卷中的数据

若要读取共享表或卷中的数据:

  1. 特权用户必须从包含该表或卷的共享创建一个目录。 此用户可以是元存储管理员、对 Unity Catalog 元存储同时拥有 CREATE_CATALOGUSE PROVIDER 特权的用户,或者是拥有 CREATE_CATALOG 特权并对提供者对象拥有所有权的用户。
  2. 该用户或拥有相同特权的用户必须向你授予对该共享表或卷的访问权限。
  3. 可以像访问 Unity Catalog 元存储中注册的任何其他数据资产一样访问该表或卷。

从共享创建目录

要使共享中的数据可供团队访问,必须基于共享创建一个目录。 若要从共享创建目录,可以使用目录资源管理器、Databricks Unity Catalog CLI,或者 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 SQL 命令。

所需的权限:元存储管理员、对 Unity Catalog 元存储同时拥有 CREATE_CATALOGUSE PROVIDER 特权的用户,或者拥有 CREATE_CATALOG 特权并对提供者对象拥有所有权的用户。

注意

如果共享包含视图,则必须使用与包含提供程序元存储中视图的目录名称不同的目录名称。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击“目录”图标“目录”。
  2. 在左侧窗格中,展开“Delta Sharing”菜单并选择“与我共享”。
  3. 在“提供程序”选项卡上选择提供程序。
  4. 在“共享”选项卡上找到该共享,然后单击共享行中的“创建目录”。
  5. 输入目录的名称和(可选的)注释。
  6. 单击“创建”。

Sql

在笔记本或 Databricks SQL 查询编辑器中运行以下命令。

CREATE CATALOG [IF NOT EXISTS] <catalog-name>
USING SHARE <provider-name>.<share-name>;

Cli

databricks unity-catalog catalogs create --name <catalog-name> /
                                    --provider <provider-name> /
                                    --share <share-name>

从共享创建的目录的目录类型为 Delta Sharing。 可以在目录资源管理器中的目录详细信息页上查看类型,或者在笔记本或 Databricks SQL 查询中运行 DESCRIBE CATALOG SQL 命令来查看类型。 所有共享目录都列在 Catalog Explorer 左窗格中的“目录 > 共享”下。

Delta Sharing 目录的管理方式与 Unity Catalog 元存储中的常规目录的管理方式相同。 可以使用目录资源管理器、Databricks CLI 以及 SHOW CATALOGSDESCRIBE CATALOGALTER CATALOGDROP CATALOG SQL 命令查看、更新和删除 Delta Sharing 目录。

通过共享创建的 Delta Sharing 目录下的 3 级命名空间结构与 Unity Catalog 上的常规目录下的命名空间结构相同:catalog.schema.tablecatalog.schema.volume

共享目录下的表和卷数据是只读的,这意味着你可以执行以下读取操作:

  • DESCRIBESHOWSELECT(针对表)。
  • DESCRIBE VOLUMELIST <volume-path>SELECT * FROM <format>.'<volume_path>'COPY INTO(针对卷)。

对目录拥有 USE CATALOG 权限的任何用户都可以预览和克隆共享该目录中的笔记本。

管理 Delta Sharing 目录中架构、表和卷的权限

默认情况下,目录创建者是 Delta Sharing 目录下所有数据对象的所有者,可以管理其中任何对象的权限。

特权将向下继承,不过,某些工作区可能仍位于不提供继承的旧式安全模型中。 请参阅继承模型。 对目录拥有 SELECT 特权的任何用户将对该目录中的所有架构和表拥有 SELECT 特权,除非撤销了该特权。 同样,对目录拥有 READ VOLUME 特权的任何用户将对该目录中的所有卷拥有 READ VOLUME 特权,除非撤销了该特权。 不能授予可对 Delta Sharing 目录或 Delta Sharing 目录中对象进行写入或更新访问的特权。

目录所有者可将数据对象的所有权委托给其他用户或组,从而为这些用户授予管理对象权限和生命周期的能力。

有关使用 Unity Catalog 管理数据对象特权的详细信息,请参阅在 Unity Catalog 中管理特权

读取共享表中的数据

可以用 Azure Databricks 用户的身份使用任何可用工具读取共享表中的数据:目录资源管理器、笔记本、SQL 查询、Databricks CLI 和 Databricks REST API。 必须对表拥有 SELECT 特权。

读取共享卷中的数据

可以用 Azure Databricks 用户的身份使用任何可用工具读取共享卷中的数据:Catalog Explorer、笔记本、SQL 查询、Databricks CLI 和 Databricks REST API。 你必须对卷拥有 READ VOLUME 特权。

查询表的历史记录数据

如果历史记录与表一起共享,你可以查询某个版本或时间戳之前的表数据。 需要 Databricks Runtime 12.1 或更高版本。

例如:

SELECT * FROM vaccine.vaccine_us.vaccine_us_distribution VERSION AS OF 3;
SELECT * FROM vaccine.vaccine_us.vaccine_us_distribution TIMESTAMP AS OF "2023-01-01 00:00:00";

此外,如果表启用了更改数据馈送 (CDF),则你可以查询 CDF。 支持版本和时间戳:

SELECT * FROM table_changes('vaccine.vaccine_us.vaccine_us_distribution', 0, 3);
SELECT * FROM table_changes('vaccine.vaccine_us.vaccine_us_distribution', "2023-01-01 00:00:00", "2022-02-01 00:00:00");

有关更改数据馈送的详细信息,请参阅在 Azure Databricks 上使用 Delta Lake 更改数据馈送

使用 Apache Spark 结构化流式处理查询表

如果表与历史记录一起共享,你可以将该表用作 Spark 结构化流式处理的源。 需要 Databricks Runtime 12.1 或更高版本。

支持的选项:

  • ignoreDeletes:忽略删除数据的事务。
  • ignoreChanges:如果由于数据更改操作(例如 UPDATEMERGE INTODELETE(分区内)或 OVERWRITE)而在源表中重写了文件,则重新处理更新。 仍可以发出未更改的行。 因此,下游使用者应该能够处理重复项。 删除不会传播到下游。 ignoreChanges 包括 ignoreDeletes。 因此,如果使用 ignoreChanges,则流不会因源表的删除或更新而中断。
  • startingVersion:要从其开始的共享表版本。 从此版本(含)开始的所有表更改都将由流式处理源读取。
  • startingTimestamp:要从其开始的时间戳。 在该时间戳(含)或之后提交的所有表更改都将由流式处理源读取。 示例: "2023-01-01 00:00:00.0"
  • maxFilesPerTrigger:要在每个微批中考虑的新文件数。
  • maxBytesPerTrigger:在每个微批中处理的数据量。 此选项设置一个“柔性最大值”,这意味着批处理大约处理此数量的数据,并且可能会超过此限制,以便在最小输入单元大于此限制的情况下,继续处理流式查询。
  • readChangeFeed:流式读取共享表的变更数据馈送。

不支持的选项:

  • Trigger.availableNow

结构化流式处理查询示例

Scala
spark.readStream.format("deltaSharing")
.option("startingVersion", 0)
.option("ignoreChanges", true)
.option("maxFilesPerTrigger", 10)
.table("vaccine.vaccine_us.vaccine_us_distribution")
Python
spark.readStream.format("deltaSharing")\
.option("startingVersion", 0)\
.option("ignoreDeletes", true)\
.option("maxBytesPerTrigger", 10000)\
.table("vaccine.vaccine_us.vaccine_us_distribution")

如果表启用了更改数据馈送 (CDF),则你可以流式读取 CDF。

spark.readStream.format("deltaSharing")
.option("readChangeFeed", "true")
.table("vaccine.vaccine_us.vaccine_us_distribution")

读取启用了删除向量的表

重要

此功能目前以公共预览版提供。

删除向量是提供商可以在共享 Delta 表上启用的一项存储优化功能。 请参阅什么是删除向量?

如果提供商共享启用了删除向量的表,则可使用 SQL 仓库或运行 Databricks Runtime 14.1 或更高版本的群集来对该表执行批量读取。 CDF 和流式处理查询需要 Databricks Runtime 14.2 或更高版本。

可以按原样执行批处理查询,因为它们可以根据共享表的表功能自动解析 responseFormat

若要读取变更数据馈送 (CDF) 或对启用了删除向量或列映射的共享表执行流式处理查询,必须设置附加选项 responseFormat=delta

以下示例显示了批处理、CDF 和流式处理查询:

import org.apache.spark.sql.SparkSession

// Batch query
spark.read.format("deltaSharing").table(<tableName>)

// CDF query
spark.read.format("deltaSharing")
  .option("readChangeFeed", "true")
  .option("responseFormat", "delta")
  .option("startingVersion", 1)
  .table(<tableName>)

// Streaming query
spark.readStream.format("deltaSharing").option("responseFormat", "delta").table(<tableName>)

读取共享视图

重要

此功能目前以公共预览版提供。

注意

视图共享仅在 Databricks 到 Databricks 共享中受支持。

读取共享视图与读取共享表相同,但以下情况除外:

计算要求:

  • 如果你的 Azure Databricks 帐户与提供者的帐户不同,则你必须使用无服务器 SQL 仓库来查询共享视图。
  • 如果提供程序位于同一 Azure Databricks 帐户上,则可以使用任何 SQL 仓库,也可以使用采用共享访问模式的群集。

视图上的视图限制:

不能创建引用共享视图的视图。

查看共享限制:

不能共享引用共享表或共享视图的视图。

命名要求:

用于包含视图的共享目录的目录名称不能与包含视图引用的表的任何提供程序目录相同。 例如,如果共享视图包含在 test 目录中,并且该视图中引用的提供程序表之一包含在提供程序的 test 目录中,则查询将导致命名空间冲突错误。 请参阅从共享创建目录

历史记录和流式处理:

不能查询历史记录或使用视图作为流式处理源。

JDBC/ODBC:

本文中的说明重点介绍如何使用 Azure Databricks 用户界面(特别是 Unity Catalog 语法和界面)读取共享数据。 还可以使用 Apache Spark、Python 和 BI 工具(如 Tableau 和 Power BI)通过 Databricks JDBC/ODBC 驱动程序查询共享视图。 若要了解如何使用 Databricks JDBC/ODBC 驱动程序进行连接,请参阅 Databricks ODBC 和 JDBC 驱动程序

读取共享笔记本

若要预览和克隆共享笔记本文件,可以使用目录资源管理器。

所需的权限:目录所有者,或者对基于共享创建的目录拥有 USE CATALOG 特权的用户。

  1. 在 Azure Databricks 工作区中,单击“目录”图标“目录”。

  2. 在左侧窗格中展开“目录”菜单,找到并选择基于共享创建的目录

  3. 在“其他资产”选项卡上,你会看到所有共享笔记本文件。

  4. 单击某个共享笔记本文件的名称以预览该文件。

  5. (可选)单击“克隆”按钮以将共享笔记本文件导入工作区。

    1. 在“克隆到”对话框中,根据需要输入新名称,然后选择要将笔记本文件克隆到的工作区文件夹。
    2. 单击“克隆”。
    3. 克隆笔记本后,会弹出一个对话框,指出已成功克隆该笔记本。 单击该对话框中的“在笔记本编辑器中显示”以在笔记本编辑器中查看它。

    请参阅 Databricks 笔记本简介