在本章中,我们将探讨如何使用Unity Catalog中的可安全管理对象有效管理数据存储位置------这些对象允许管理员向用户、组和服务主体授予细粒度的权限。我们将讨论六种类型的可安全管理对象,用于在Unity Catalog中存储数据:目录、模式、表格、卷、外部位置和连接。我们还将介绍如何有效地治理组织内不同角色和部门之间的存储访问,确保Databricks数据智能平台中的数据安全性和可审计性。最后,我们将概述如何在Unity Catalog中组织和结构化不同存储位置的数据。
在本章中,我们将涵盖以下主要主题:
- 在Unity Catalog中创建和管理数据目录
- 为Unity Catalog中的数据设置默认存储位置
- 在Unity Catalog中创建和管理外部存储位置
- 实践实验 -- 提取文档文本以用于生成式AI管道
技术要求
要跟随本章提供的示例,您需要Databricks工作区权限来创建并启动全能集群,以便导入并执行本章的附带笔记本。所有代码示例可以从本章的GitHub仓库下载,地址为 github.com/PacktPublis... 。还建议将您的Databricks用户提升为元存储管理员(第5章已介绍),以便您可以添加和删除外部位置、安全凭证、外部连接,并将目录绑定到Databricks工作区。本章将创建并运行几个新的笔记本,预计消耗大约5-10个Databricks单位(DBU)。
在Unity Catalog中创建和管理数据目录
目录是Unity Catalog对象模型层次结构中的最高容器,用于存储数据资产。一个目录将包含一个或多个模式(或数据库),这些模式可以包含一个或多个表格、视图、模型、函数或卷。
一个常见的问题是"我的工作区应该有多少个目录?"虽然对于应该创建多少个目录没有明确的正确答案,但一个好的经验法则是根据自然的划分因素来拆分工作区目录,比如业务线、逻辑工作环境、团队或使用场景等。此外,您还应该考虑哪些用户或组将被授权使用数据资产,这也会影响目录隔离的创建方式。
重要提示
最佳实践是不要创建太少的目录,以至于无法合理地将数据集相互区分。同样,最佳实践也不要在一个工作区内创建过多的目录,因为这样会使用户难以浏览和发现数据集。目标是找到两者之间的平衡点。
元存储管理员或 Unity Catalog 中的特权用户可以授予其他用户在元存储中创建额外目录的权限。例如,以下的授予语句由元存储管理员执行,将授予 Databricks 用户 jane.smith@example.com 在其 Databricks 工作区附加的元存储中创建新目录的权限:
sql
GRANT CREATE CATALOG ON METASTORE TO `jane.smith@example.com`;
此外,对于 2023 年 11 月 8 日后创建的 Databricks 工作区,Unity Catalog 元存储中会创建一个默认的工作区目录,命名为 <workspace_name>_catalog
。默认情况下,工作区中的所有用户都可以访问该目录并创建数据资产。
托管数据与外部数据
当您部署 Unity Catalog 元存储时,部署过程的一部分包括在元存储级别设置一个新的默认云存储容器。这个云存储容器作为所有在 Databricks 数据智能平台上创建的数据资产的默认位置。例如,当用户创建一个新表且未在数据定义语言(DDL)语句中指定 LOCATION 属性时,Databricks 数据智能平台会将表数据存储在默认存储容器中。因此,平台将负责管理该表的生命周期,包括数据文件、元数据,甚至表的特性,如调优表的布局和文件大小。这种类型的数据资产被称为托管表,因为 Databricks 数据智能平台将管理其生命周期。此外,如果删除该表,平台将负责移除所有表的元数据和数据文件。
然而,如果用户在 DDL 语句中提供 LOCATION 属性,则会覆盖默认行为。用户明确指示 Databricks 数据智能平台将数据存储在 Unity Catalog 默认存储容器之外的一个位置。因此,这种类型的数据资产被称为外部表。Databricks 不会管理该表的性能特性,如文件大小或文件布局。与托管表不同,如果删除外部表,只会从 Unity Catalog 中删除该表的条目,而表的元数据和数据文件不会从外部位置删除。相反,表的拥有者需要负责删除云位置中的表文件,因为他们已经接管了表的生命周期管理。
通常来说,托管意味着 Databricks 平台管理生命周期,数据将存储在默认存储容器中;而外部则意味着对象所有者控制对象生命周期,数据应存储在外部存储位置。
事实上,您可能有充分的理由希望将数据资产存储在不同于元存储默认位置的存储位置。例如,对于包含敏感数据的特权数据集,如个人可识别信息(PII)或受保护健康信息(PHI),您可能希望将这些数据集存储在一个单独的存储帐户中。或者,您可能有合同义务要求数据必须存储在隔离的存储帐户中。在任何情况下,数据隔离的需求都非常常见。在接下来的部分中,我们将了解 Unity Catalog 中的另一个可安全存储任意类型数据的对象,同时保持与传统表和视图的强隔离。
将数据保存到 Unity Catalog 中的存储卷
存储卷(volume)是存储卷的简称,可以用来存储各种格式类型的文件。此外,存储卷可以与表和视图一起存储在 Unity Catalog 中的一个模式下。表和视图用于存储结构化数据,而存储卷可以用来存储结构化、半结构化或非结构化数据。
存储卷的管理可以由 Databricks 数据智能平台来完成,删除后,存储容器及其全部内容将被完全移除。另一方面,存储卷也可以是外部卷,这意味着卷的拥有者管理存储卷的存储位置,删除后,存储容器的内容不会被移除。
存储卷通过去除在 Unity Catalog 中创建和管理外部存储位置及存储凭证对象的开销,简化了文件的存储。相比之下,外部位置需要与存储凭证一起创建,这使得资源的配置和撤销稍微复杂一些。
存储卷为特定模式的用户提供了灵活性,可以将任意文件存储在由 Databricks 数据智能平台管理的安全存储位置。默认情况下,存储卷会将数据保存在父模式的默认存储位置中。例如,如果在创建模式时没有提供存储位置,那么存储卷中的数据将保存在 Unity Catalog 元存储的默认存储帐户中。而如果模式是与显式存储位置一起创建的,则默认情况下,存储卷将把其内容存储在此云位置中。
元存储管理员或具有显式权限的特权用户可以在目录中创建或删除存储卷。以下示例授予 Databricks 用户创建开发目录存储卷的显式权限:
sql
GRANT CREATE VOLUME
ON CATALOG development_catalog
TO `jane.smith@example.com`;
完全限定的存储卷路径是通过/Volumes/ 后跟目录、模式和存储卷名称来构建的。例如,可以使用以下路径引用一个任意文本文件:
bash
/Volumes/catalog_name/schema_name/volume_name/subdirectory_name/arbitrary_file.txt
在之前的示例中,我们让 Databricks 数据智能平台决定如何使用模式、表、视图和存储卷来存储数据。然而,我们也可以为某些可安全存储的对象设置规定的云位置。接下来,我们将看看如何在 Unity Catalog 中使用几种技术来控制存储位置。
在 Unity Catalog 中设置数据的默认位置
您可以通过几种技术控制 Unity Catalog 中数据的存储位置:
- 在目录级别设置默认位置:在创建新目录时,数据管理员可以指定一个存储位置。当创建数据资产(如表)且未指定位置时,数据将存储在目录位置中。
- 在模式级别设置默认位置:同样,您可以在模式级别指定默认位置。模式位置将覆盖目录级别指定的任何默认位置。当创建数据资产(如表)且未指定位置时,数据将存储在模式位置中。
- 在表级别设置外部位置:这是数据管理员对数据集的最精细控制。表的位置将覆盖目录级别或模式级别指定的任何默认位置。
- 存储卷位置:与外部位置密切相关(在 Unity Catalog 中创建和管理外部存储位置部分讨论),存储卷允许控制表数据存储在云存储位置中的位置。
将目录隔离到特定工作区
默认情况下,当您在 Unity Catalog 中创建目录时,该目录将对元存储管理员可用,管理员可以授予用户在使用该元存储的所有 Databricks 工作区中访问权限。然而,在某些情况下,您可能希望覆盖这一行为,并对某个目录中存储的数据集进行更强的隔离。例如,敏感数据集可能只应在生产工作区中进行数据管道处理,而不应在开发等低环境中使用。Unity Catalog 的一个功能叫做目录绑定,可以帮助解决这种场景。通过目录绑定,目录管理员(如元存储管理员或目录所有者)可以控制哪些工作区可以访问特定的目录。对于没有绑定到特定目录的 Databricks 工作区,该目录将不会出现在目录资源管理器 UI 的搜索结果中。
此外,数据管理员可以指定特定工作区绑定的数据集可执行的操作类型。例如,假设您希望限制某个目录中存储的数据集在测试环境中的访问权限为只读。数据管理员可以通过 UI 使用 Databricks 数据智能平台中的目录资源管理器,或使用自动化工具,如 Terraform 或 REST API,来更改目录的绑定设置。让我们看一个如何利用 Databricks REST API 将包含 PII 数据的测试目录绑定到生产工作区的示例。
首先,我们通过更新目录的默认设置来开始,使目录不会从所有使用我们 Unity Catalog 元存储的工作区中访问。默认情况下,该属性设置为 OPEN
,而我们希望将目录仅隔离到一个特定的工作区:
ini
import requests
catalog = "testing_catalog"
response = requests.patch(
f"https://{workspace_name}/api/2.1/unity-catalog/catalogs/{catalog}",
headers = {"Authorization": f"Bearer {api_token}"},
json = {"isolation_mode": "ISOLATED"}
)
print(response.json())
我们还可以使用目录资源管理器来验证我们的目录隔离模式是否已通过之前的请求更新。在 Databricks 工作区中,从左侧边栏菜单导航到目录资源管理器。接下来,在搜索框中输入目录的名称以过滤目录,并点击目录名称。在目录资源管理器 UI 中,在详细信息中验证"所有工作区都有访问权限"复选框不再被选中。
现在,由于我们的目录不再对元存储管理员开放,从所有使用我们 Unity Catalog 元存储的工作区中授予访问权限,我们希望将目录绑定到仅允许用户访问的工作区。
在下一个示例中,我们将再次使用 Databricks REST API,允许生产工作区的数据管理员为目录中的数据集分配只读访问权限:
ini
response = requests.patch(
f"https://{workspace_name}/api/2.1/unity-catalog/bindings/catalog/{catalog}",
headers = {"Authorization": f"Bearer {api_token}"},
json = {"add": [{
"workspace_id": <production_workspace_id>,
"binding_type": "BINDING_TYPE_READ_ONLY"}]
}
)
print(response.json())
重要提示
在上述示例中,我们在请求负载中提供了工作区标识符,用于将目录绑定到 Unity Catalog 中的工作区。如果您不确定工作区标识符是什么,可以通过检查 Databricks 工作区的 URL 来快速找到它。工作区标识符可以在 Databricks 工作区 URL 的第一个 URI 部分找到,格式为 https://<workspace_name>.cloud.databricks.com/o=<workspace_id>
。工作区标识符是紧跟在 o=
URL 参数后面的数字值。
到这里,您应该理解目录绑定在允许数据管理员控制数据访问权限,并进一步隔离 Databricks 数据智能平台中的数据集方面的影响。然而,可能存在某些场景,数据管理员需要控制云存储位置,例如满足合同要求,确保在数据管道处理期间数据集不共存于同一位置。在接下来的部分,我们将探讨数据管理员如何为数据集分配特定的云存储位置。
在 Unity Catalog 中创建和管理外部存储位置
Databricks 的一个强项是数据的开放性,这意味着用户可以连接到存储在各种云原生存储系统中的数据。例如,用户可以连接到存储在 Amazon S3 服务中的数据,并将这些数据与存储在 Azure Data Lake Storage (ADLS) Gen2 存储容器中的另一个数据集进行连接。然而,其中的一个缺点是,与这些云原生存储服务的集成需要复杂的配置设置,这些设置通常在笔记本执行开始时进行配置,或者可能在集群启动时的初始化脚本中设置。这些配置设置很复杂,至少需要将它们存储在 Databricks 秘密中,且身份验证令牌需要由云管理员进行轮换------这对一个本来简单的任务(使用 Spark 的 DataFrameReader 加载远程数据)来说,维护周期非常复杂。Unity Catalog 带来的一个关键好处是一个可安全存储的对象,称为存储凭证(storage credential),它旨在简化这项维护任务,同时允许最终用户存储和连接到 Databricks 数据智能平台之外的数据集。云管理员或元存储管理员可以将云服务的身份验证详细信息存储在一个地方,避免不太懂技术的最终用户需要配置复杂的云身份验证详细信息,如 IAM 角色标识符。以下代码片段是一个示例,展示了如何使用在代码执行过程中设置的配置来配置对 ADLS Gen2 容器的身份验证:
python
# 连接到存储在 ADLS Gen2 容器中的数据
account_name = "some_storage_account"
spark.conf.set(f"fs.azure.account.auth.type.{account_name}.dfs.core.windows.net", "SAS")
spark.conf.set(f"fs.azure.sas.token.provider.type.{account_name}.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
# 使用 Databricks 秘密安全存储并检索 SAS 密钥,以进行 ADLS 服务身份验证
spark.conf.set(
f"fs.azure.sas.fixed.token.{account_name}.dfs.core.windows.net",
dbutils.secrets.get(scope="sas_token_scope",
key="sas_token_key"))
使用存储凭证存储云服务身份验证
存储凭证是 Unity Catalog 中的一个可安全存储的对象,它抽象了访问云存储帐户的云原生凭证。例如,存储凭证可以表示 Amazon Web Services (AWS) 云中的身份与访问管理(IAM)角色。存储凭证也可以表示 Azure 云中的托管身份或服务主体。一旦创建了存储凭证,就可以通过显式的授予语句将对存储凭证的访问权限授予 Unity Catalog 中的用户和组。像 Unity Catalog 中的其他可安全存储对象一样,有多种方法可以在 Databricks 数据智能平台上创建新的安全凭证。例如,元存储管理员可以选择使用美国国家标准协会结构化查询语言(ANSI SQL)来创建存储凭证,或者使用 Databricks UI。
存储凭证与 Unity Catalog 中的另一个可安全存储对象------外部位置(external location)------配对使用,二者的结合用于存储和访问特定云存储帐户中的数据。
您必须是 Databricks 账户管理员或 Unity Catalog 元存储的元存储管理员,这样才能拥有 CREATE STORAGE CREDENTIAL 权限。以下示例使用 Databricks 命令行工具(CLI)在 Unity Catalog 中创建一个新的存储凭证,使用的是 AWS 中的 IAM 角色:
css
databricks storage-credentials create \
--json '{"name": "my_storage_cred", ' \
'"aws_iam_role": {"role_arn": ' \
'"arn:aws:iam::<role_identifier>:role/<account_name>"}}'
这次我们使用 SQL API 授予数据科学组使用该凭证访问云存储的权限:
sql
-- 授予使用存储凭证创建外部位置的权限
GRANT CREATE EXTERNAL LOCATION
ON STORAGE CREDENTIAL my_s3_bucket_cred
TO `data-science`;
然而,Databricks 数据智能平台之外的存储容器可能不是您希望从数据湖仓连接到的唯一数据源。例如,可能存在您需要连接到外部系统(如现有的数据仓库或关系数据库)进行交叉引用数据的场景。让我们关注 Lakehouse Federation,它允许数据湖仓用户查询 Databricks 数据智能平台之外的数据集。
使用 Lakehouse Federation 查询外部系统
Lakehouse Federation 是 Databricks 数据智能平台中的一项功能,允许用户在无需将数据迁移到数据湖仓的情况下,对 Databricks 外部的存储系统执行查询。Unity Catalog 中的另一个可安全存储的对象称为 连接(connection) ,可以用于将查询联合到外部系统。连接代表一个只读的连接,指向外部系统,例如关系数据库管理系统(RDBMS),如 Postgres 或 MySQL,或者云数据仓库,如 Amazon Redshift。这是查询外部数据的一种很好的方式,可以快速在数据湖仓中原型化新的数据管道。也许,您需要交叉引用一个外部数据集,但暂时不想经历创建另一个提取、转换和加载(ETL)管道的冗长过程来引入新的数据源。
可以通过在 Databricks 数据智能平台中导航到目录资源管理器,展开 连接 面板,点击 外部连接 来查看已创建连接的详细信息。
让我们看一个如何使用 Databricks 中的 SQL 连接 API 创建到 MySQL 数据库的新外部连接的示例。Databricks 推荐将所有凭证信息存储在 Databricks 秘密中,这样可以通过 SQL 中的 secret()
函数轻松检索,并提供秘密作用域和秘密密钥:
java
CREATE CONNECTION my_mysql_connection TYPE mysql
OPTIONS (
host '<fully_qualified_hostname>',
port '3306',
user secret('mysql_scope', 'mysql_username'),
password secret('mysql_scope', 'mysql_password')
)
接下来,点击左侧导航栏中的 目录资源管理器 ,展开 外部数据 面板,点击 连接 菜单项,进入连接 UI。您现在应该能看到新创建的 MySQL 数据库连接,点击它将显示该连接的详细信息。
让我们将之前学习的内容连接起来,构建一个能够驱动生成型 AI 用例的现代数据管道。
动手实验 -- 为生成型 AI 管道提取文档文本
在这个示例中,我们将查看一个典型的管道,用于从文档中提取文本,以支持生成型 AI 的应用。这个架构模式非常常见,特别是对于现实世界中的用例,例如在一个文本语料库上训练聊天机器人。在这个过程中,我们将看到 Databricks 数据智能平台上的存储卷如何非常适合处理来自外部云存储位置的任意文件。所有代码示例可以从本章的 GitHub 仓库下载,地址为:GitHub repository。
生成模拟文档
数据管道的第一步是生成任意文本文件,用于提取文本。让我们首先在 Databricks 工作区中创建一个新的笔记本,用于训练我们组织的聊天机器人。以下代码示例使用流行的 Python 库 faker 来随机生成文档中的内容,使用 reportlab Python 库来生成 PDF 文件。
首先,使用 %pip
魔法命令在笔记本的第一个单元中安装库依赖:
perl
%pip install faker reportlab
定义辅助函数
接下来,我们定义一些辅助函数,用于将随机生成的文本段落保存为文档。我们将定义三个辅助函数------每种文档格式类型一个------分别是纯文本、PDF 和 CSV:
首先,定义用于保存纯文本文件的辅助函数:
python
from shutil import copyfile
def save_doc_as_text(file_name, save_path, paragraph):
"""辅助函数,将一段文本保存为文本文件"""
tmp_path = f"/local_disk0/tmp/{file_name}"
volume_path = f"{save_path}/{file_name}"
print(f"正在保存文本文件至 : {tmp_path}")
txtfile = open(tmp_path, "a")
txtfile.write(paragraph)
txtfile.close()
copyfile(tmp_path, volume_path)
接下来,定义用于保存 PDF 文件的辅助函数:
python
def save_doc_as_pdf(file_name, save_path, paragraph):
"""辅助函数,将一段文本保存为 PDF 文件"""
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import cm
tmp_path = f"/local_disk0/tmp/{file_name}"
volume_path = f"{save_path}/{file_name}"
canvas = Canvas(tmp_path, pagesize=letter)
lines = paragraph.split(".")
textobject = canvas.beginText(5*cm, 25*cm)
for line in lines:
textobject.textLine(line)
canvas.drawText(textobject)
canvas.save()
print(f"正在保存 PDF 文件至 : {tmp_path}")
copyfile(tmp_path, volume_path)
最后,定义用于保存 CSV 文件的辅助函数:
python
def save_doc_as_csv(file_name, save_path, paragraph):
"""辅助函数,将一段文本保存为 CSV 文件"""
import csv
tmp_path = f"/local_disk0/tmp/{file_name}"
volume_path = f"{save_path}/{file_name}"
print(f"正在保存 CSV 文件至 : {tmp_path}")
with open(tmp_path, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Id", "Sentence"])
i = 1
for line in paragraph.split("."):
writer.writerow([i, line])
i = i + 1
copyfile(tmp_path, volume_path)
这是一个很好的方法,可以模拟您的组织可能随着时间积累的各种文档类型。
随机选择文件格式
接下来,我们需要随机选择文件格式来保存生成的文档。首先,让我们导入 faker 库和一些 Python 实用库,用于创建不可预测的行为。我们还将定义一些全局变量,用于确定我们随机生成的文档的特征,例如要生成的文档数量、每个文档生成的句子数以及保存文档的文件格式类型。将以下代码片段添加到笔记本中:
ini
from faker import Faker
import time
import random
Faker.seed(631)
fake = Faker()
# 随机生成文档
num_docs = 5
num_sentences_per_doc = 100
doc_types = ["txt", "pdf", "csv"]
volume_path = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}"
接下来,我们创建一个简单的 for 循环,作为我们的随机文档生成器的核心。在 for 循环中,我们将使用 faker 库创建一段随机文本,其句子数等于我们设置的 num_sentences_per_doc 全局变量:
scss
for _ in range(num_docs):
paragraph = fake.paragraph(nb_sentences=num_sentences_per_doc)
在生成了随机文本段落后,接下来是选择将文本保存为何种文件格式。我们将利用 random Python 库从 doc_types 全局变量中定义的文件格式列表中随机选择一个文件格式类型。将以下代码片段添加到 for 循环的主体部分:
ini
# 随机选择文档格式类型
doc_type = doc_types[random.randrange(2)]
print(doc_type)
if doc_type == "txt":
doc_name = f"{fake.pystr()}.txt"
save_doc_as_text(doc_name, volume_path, paragraph)
elif doc_type == "pdf":
doc_name = f"{fake.pystr()}.pdf"
save_doc_as_pdf(doc_name, volume_path, paragraph)
elif doc_type == "csv":
doc_name = f"{fake.pystr()}.csv"
save_doc_as_csv(doc_name, volume_path, paragraph)
最后,我们添加一个 sleep 定时器来模拟文本文档生成中的不可预测的高峰和低谷------这在典型的生产环境中是常见的。将以下代码片段添加到 for 循环主体的底部:
lua
# 随机休眠一段时间
sleep_time = random.randint(3, 30)
print(f"正在休眠 {sleep_time} 秒...\n\n")
time.sleep(sleep_time)
您还会注意到,在笔记本的全局变量部分,我们为保存随机生成文档的过程定义了一个存储卷路径:
python
volume_path = f"/Volumes/{catalog_name}/{schema_name}/{volume_name}"
这是引用云存储位置的便捷方式,就像引用本地存储路径一样。此外,我们还享受 Unity Catalog 中存储卷所带来的强大数据治理优势。例如,所有数据默认都受到保护,其他用户或进程在我们获得访问存储卷数据的权限之前,无法读取这些文档。最后,让我们将新笔记本连接到 Databricks 数据智能平台中的一个正在运行的通用集群,并点击笔记本顶部的 Run all 按钮,开始生成并保存新文档到我们的存储卷位置。
创建/组装 DLT 管道
现在我们已经生成了一些文本文档,让我们创建一个新的 DLT 管道,该管道将流式传输随机生成的文档,并执行简单的文本提取。将本章 GitHub 仓库中的名为 Preprocess Text Documents.py 的笔记本导入到您的 Databricks 工作区。您会注意到,我们定义了三个新的流式表,它们分别负责摄取随机生成的文本、PDF 和 CSV 文档。在做了最少的预处理之后,这些数据源中的文本字段被提取并连接到第四个表 text_docs_silver。这个第四个表将作为我们聊天机器人训练的输入:
less
@dlt.table(
name="text_docs_silver",
comment="用于生成型 AI 管道的组合文本文档。"
)
def text_docs_silver():
text_docs_df = dlt.read("text_docs_raw").withColumn(
"type", F.lit("text"))
csv_docs_df = dlt.read("csv_docs_raw").withColumn(
"type", F.lit("csv"))
pdf_docs_df = dlt.read("pdf_docs_raw").withColumn(
"type", F.lit("pdf"))
combined_df = text_docs_df.union(csv_docs_df).union(
pdf_docs_df)
return combined_df
将笔记本附加到正在运行的集群后,系统会提示您创建一个新的 DLT 管道。继续创建一个全新的 DLT 管道(本章第 2 章讲解),为管道命名一个有意义的名称,例如 doc_ingestion_pipeline 。选择 Triggered 作为处理模式,选择 Core 作为产品版本,并接受其余默认设置。最后,点击 Start 开始更新执行新创建的 DLT 管道。
您应该会看到 DLT 管道逐步处理随机生成的文本文档,从每种不同的文件类型中提取文本,并将它们合并成一个汇总数据集。这是一个简单却强大的示例,展示了如何将 DLT 与 Unity Catalog 中的存储卷结合使用,在实际用例中处理任意文件格式。
总结
在本章中,我们介绍了使用 Unity Catalog 中的不同可安全存储对象来存储数据并同时保持细粒度的访问控制的多种方法。我们讨论了如何通过目录、模式、表、视图、存储卷和外部位置来存储数据。我们还展示了组织如何将目录绑定到单独的 Databricks 工作区,以便隔离数据集,甚至设置只读访问权限。我们讨论了 Databricks 数据智能平台中托管数据集的区别,以及如何为数据存储设置规定的存储位置,包括目录、模式、表、存储卷和外部位置。我们还介绍了如何使用 Lakehouse Federation 在不迁移数据的情况下查询外部数据源,如数据仓库。最后,我们通过一个动手实验,展示了如何利用 Unity Catalog 中的存储卷实现生成型 AI 管道的起始部分,从文档中提取文本。
现在,我们已经为存储数据和其他资产奠定了坚实的基础。在下一章中,我们将介绍如何跟踪 Databricks 数据智能平台中各种对象的血缘关系。