文件类型与非结构化数据

Important

此功能在 Beta 版中。 工作区管理员可以从 预览 页控制对此功能的访问。 请参阅 Manage Azure Databricks 预览版

FILE 类型存储对非结构化文件的受控引用,包含路径和大小等元数据。 在Unity Catalog中使用 FILE 列来存储文档、图片和音频,同时存储结构化数据。

对于 FILE MANAGED 列,Unity Catalog 存储文件副本并用表格管理:删除行后,引用的文件有资格进行垃圾回收,因此表格和文件保持同步。

关于类型参考,请参见 FILE 类型

下图显示了一个名为 videoFILE 列,该列引用驾驶片段,以及路线、场景描述和危险标签等结构化列:

一个驾驶片段表,视频列为FILE类型。每一行将结构化列(剪辑ID、路线、场景描述、危险标签和嵌入)与一个视频文件引用配对,该文件引用显示缩略图和大小(如1.8 GB)。

文件元数据与存储

对于每一行,类型 FILE 存储元数据和存储中文件的受控链接。 一个 FILE 值包括 urisizecontent_typechecksum 元数据字段。 元数据查询不需要完整读取文件,从而提升了查询性能。

可以将值传递给 FILE AI 函数(如ai_parse_document函数)和用户定义的函数(UDF)。

下图展示了一个示例的管理 FILE 列,包含路径和大小元数据以及存储中文件的引用:

带有视频列的剪辑表以 FILE 类型存储,显示为路径和大小对。箭头将每行链接到存储中的文件,展示表与文件之间的受控引用。

为什么用FILE而不是BINARY或STRING

下表详细列出了处理BINARYSTRING类型的大型非结构化文件时面临的挑战:

列类型 Description 图表
BINARY 每次读取时都会将整个对象完整加载出来,即使你只需要文件大小或路径等元数据。 这导致了不必要的计算和查询速度缓慢。 视频列以 BINARY 类型存储的片段表。每个多吉字节视频的原始字节数据在内联方式中实现在该列中。
STRING 存储一个没有元数据(如大小或版本信息)的文件路径,也没有表与文件之间的管理链接。 如果其他工作负载删除了该文件,表中的信息已经过时。 如果你移除了某一行表,引用的文件会一直存储在存储中,直到你手动移除它。 带有视频列的剪辑表以字符串路径存储,例如 s3://.../NW-0142。其中一条路径不再解析到卷中的某个文件,表明字符串路径并不能保证文件的存在,治理也已解除关联。

校验和

checksum 字段是用于文件字节的完整性令牌,格式为 <prefix>:<digest>。 用它来比较文件或确认文件没有变化。 读取器会忽略带有无法识别前缀的校验和。

校验和并不总是可用。 to_file 函数create_file 函数copy_file 函数会在对象存储返回一个 ETAG 时填充校验和。 list_files 表值函数read_files 表值函数 不填充校验和。

checksum 字段使用以下前缀之一:

前缀 摘要编码 Description
ETAG Opaque 对象存储中整个文件的 eTag。 商店逐字提供,仅用于等式比较,不可重新计算。
MD5 小写十六进制 一份MD5摘要(RFC 1321),32个十六进制字符。
CRC32 小写十六进制 CRC32 校验和(RFC 2083),由 8 位十六进制字符组成。
CRC32C 小写十六进制 CRC32C 校验和(RFC 3385),由 8 个十六进制字符组成。
SHA-256 小写十六进制 SHA-256摘要(RFC 6234),64个十六进制字符。

例如,MD5 校验和看起来像 MD5:d41d8cd98f00b204e9800998ecf8427e,而对象存储的 eTag 看起来像 ETAG:"686897696a7c876b7e",其中包括对象存储返回的双引号。

FILEBINARY 之间选择

下表比较了处理非结构化文件的各种选项:

列类型 价值观 用例
FILE 一个受管控的文件引用,以及元数据(urisizecontent_typechecksum)。 用于管理和处理非结构化文件以及结构化数据,并将文件传递至内置函数和 AI 函数。
BINARY 文件的原始字节数据,以内联方式存储于列中。 用于直接存储在数据文件中的小型对象(默认最大64 KB)。 当你需要低元数据开销和简化文件管理时,这非常有用。 例如,可以用它来存储与行数据相连的缩略图。

受管文件和外部文件

FILE 类型支持两种文件管理方式:

  • FILE MANAGED 列会将文件复制到托管存储中。 通过该表格简化和管理权限。 当你删除行,或更新行以引用不同文件时,未被引用的文件就有资格进行垃圾回收,因此表和文件保持同步。对于通过表访问文件的工作载荷,如机器学习训练或检索增强生成(RAG),以及从外部来源导入的文件,可以使用这种方法。 有关摄入模式,请参阅将文件作为 FILE 类型摄入
  • FILE EXTERNAL 列引用 Unity Catalog 卷中的现有文件。 文件由 Unity 目录卷权限保护,但它们的生命周期不由 Unity 目录管理,也不会被复制。 当你需要引用文件,而又不想移动数据或干扰从现有卷读取数据的工具时,请使用这种方法。

Azure Databricks 建议FILE MANAGED适合需要文件级权限和内置合规性的工作负载:每个文件的访问都通过引用该文件的表来管理,删除行后,被引用的文件才有资格进行垃圾回收。 当文件必须保留在其现有卷路径中,以供在表外读取这些文件的工具使用时,请使用 FILE EXTERNAL

查询时,管理文件和外部文件没有区别。

下图展示了 FILE 类型如何将你的代码连接到云对象存储中的文件:

FILE 类型架构示意图。Python、SQL、Scala 和 UDF 客户端使用单一文件类型,读取元数据而不获取文件字节。FILE MANAGED 将文件存储在一个文件空间中,访问由表层管理,删除行后文件有资格进行垃圾回收。文件外部引用文件在UC卷中其现有路径,受卷权限管理。这两种模式都将文件存储在云对象存储中,如S3、ADLS或Google云存储。

FILE MANAGED

FILE MANAGED 列将文件的副本存储在 FileSpace 中,即您为该表声明并用作托管存储的 Unity Catalog 卷。 它们的生命周期与引用它们的表绑定:删除行后,被引用的文件有资格进行垃圾回收,因此表和文件保持同步。

以下行为适用于 FILE MANAGED

  • 声明 FileSpace 需要 databricks.filespace-preview 表属性。
  • 读取或写入受管理文件需要同时访问表和支持该 FileSpace文件的卷。
  • 测试版不支持自动对未引用文件进行垃圾回收。

存储在外部来源(如 SharePoint、Google Drive、OneDrive 和 SFTP)中的非结构化文件必须先作为托管文件被导入,才能与函数和ai_parse_document用户定义函数(UDF)等功能一起使用。 有关摄入模式,请参阅将文件作为 FILE 类型摄入

要使用受管文件,请创建一个包含 FILE MANAGED 列的表,并将 databricks.filespace-preview 表属性设置为卷路径,以此声明卷 FileSpace

'databricks.filespace-preview' = '/Volumes/<catalog>/<schema>/<volume_name>/<optional_path>'

完整示例请参见以下 FILE MANAGED 示例。

FILE MANAGED 示例

要创建带有 FILE MANAGED 列的表:

CREATE TABLE reports (id BIGINT, file FILE MANAGED)
  TBLPROPERTIES ('databricks.filespace-preview' = '/Volumes/my_catalog/my_schema/my_managed_volume/');

要向现有表添加 FILE MANAGED 列,请在添加列之前设置 databricks.filespace-preview 表属性,如下代码所示:

ALTER TABLE reports SET TBLPROPERTIES ('databricks.filespace-preview' = '/Volumes/my_catalog/my_schema/my_managed_volume/');

ALTER TABLE reports ADD COLUMN attachment FILE MANAGED;

向没有FileSpace的表添加FILE MANAGED列会失败。

删除未被引用的托管文件

由于不支持自动垃圾回收,请自行删除未引用的文件。 以下笔记本会查找 FileSpace 中未被任何表版本引用的文件,并可选择将其删除:

文件类型垃圾回收笔记本

获取笔记本

FILE EXTERNAL

FILE EXTERNAL 列是 Unity Catalog 卷中已存在文件的引用。

如果你对该卷拥有必要的权限,可以更新或删除这些文件。 Databricks建议你使用不可变文件。 对表的授权会使文件元数据可被访问,但要读取文件的字节内容,还需要具备底层卷上的 READ VOLUME 权限。

外部文件将每行表数据映射到 Unity Catalog 卷中其现有路径下的文件:

一个包含按阶段文件夹组织试用文件的 UC 卷示意图,该卷映射到一个 EXTERNAL FILE 列。每行数据通过卷路径引用一个文件,并添加“队列”和“研究阶段”等结构化列。

FILE EXTERNAL 示例

要创建带有 FILE EXTERNAL 列的表:

CREATE TABLE documents (id BIGINT, file FILE EXTERNAL);

要向现有表添加 FILE EXTERNAL 一列:

ALTER TABLE documents ADD COLUMN file FILE EXTERNAL;

要从卷中创建并填充表,为每个文件分配唯一ID:

CREATE TABLE documents AS
  SELECT monotonically_increasing_id() AS id, file
  FROM list_files('/Volumes/samples/sec/contracts/');

治理与生命周期比较

下表比较了 FILE EXTERNALFILE MANAGED 如何控制文件访问并处理文件生命周期:

列类型 FILE MANAGED FILE EXTERNAL
文件访问控制 受表和卷权限控制,例如表上的 SELECT 和卷上的 READ VOLUME 受卷访问权限约束,例如 READ VOLUME
生命周期和垃圾回收 文件与引用这些文件的行相关联。 删除这些行后,文件才有资格进行垃圾回收。 不支持自动垃圾回收。 你自己管理文件。 删除表中的一行不会影响卷中的底层文件。

FILE 类型用例

托管类型和外部 FILE 类型都应对了使用非结构化数据的用例面临的以下挑战:

挑战 支持的 FILE 类型 优点
文件过大,无法作为 BINARY 内联存储 FILE MANAGEDFILE EXTERNAL FILE 存储引用,因此当AI函数或UDF处理文件时,文件才被读取。 这样可以避免将大对象直接存储在表中。
文件系统与表之间生命周期和治理的脱节 FILE MANAGED Azure Databricks 将每个文件的生命周期与表关联起来,因此删除行时,这些文件就会符合清理条件,而不会在存储中留下孤立文件。
需要文件保持在同一位置的并发工作负载 FILE EXTERNAL 文件会保留在其现有卷路径中,不受表生命周期的影响,因此读取同一文件的其他工具也不会受到干扰。

后续步骤