非结构化数据类型

Snowflake 支持三种不同的数据:

  • *结构化数据*(例如 CSV 文件)遵循严格的表格架构。结构化数据可以轻松加载到 SQL 表中。

  • *半结构化数据*(例如 JSON 或 XML 文件)具有灵活的架构。Snowflake 可以使用特殊函数访问半结构化数据中的字段,但是数据不像结构化数据那样容易查询。可以使用 VARIANT 列将半结构化数据加载到 SQL 表中。

  • *非结构化数据*(例如文档、图像或音频文件)没有固有的架构。非结构化数据可能仍具有内部结构(例如,PNG 图像文件必须遵循文档格式),但此类技术细节通常与文件中的信息无关。

Snowflake 提供了处理非结构化文件(例如 AI COMPLETE 函数文档 AI

要在 Snowflake 中使用非结构化数据,必须先将其存储在内部或外部暂存区。处理非结构化数据的 Snowflake 函数会从此处读取数据。根据函数的不同,您可以通过以下一种或多种方式指定文件:

  • 通过将暂存区名称和文件的相对路径作为两个单独的实参传递给将要使用它的函数。

  • 通过将 暂存区作用域 URL 作为字符串传递。

  • 通过传递使用 TO_FILETRY_TO_FILE 函数创建的 FILE 对象。

FILE 数据类型

Snowflake 为非结构化数据提供 FILE 数据类型。FILE 值表示存储在内部或外部暂存区的文件,但不存储文件数据,仅存储对该文件的参考。它包含以下元数据:

  • STAGE:文件所在暂存区的名称。

  • RELATIVE_PATH:文件所在暂存区的相对路径。

  • STAGE_FILE_URL:暂存区文件 URL。

  • SCOPED_FILE_URL:作用域文件 URL。

  • CONTENT_TYPE:文件的 MIME 类型。

  • SIZE:文件的大小,以字节为单位。

  • ETAG:文件内容的唯一哈希值。

  • LAST_MODIFIED:上次修改文件的时间戳。

并非所有这些字段都是必填字段。一个 FILE 必须包含以下字段:CONTENT_TYPE、SIZE、ETAG 和 LAST_MODIFIED,同时还必须通过以下三者之一来指定文件的位置:STAGE 加上 RELATIVE_PATH、STAGE_FILE_URL 或 SCOPED_FILE_URL。

您可以通过将作用域文件 URL、暂存区和路径或元数据对象传递给:doc:TO_FILE </sql-reference/functions/to_file>TRY_TO_FILE 函数来创建文件。

FILE 函数

子类别

函数

构造函数

TO_FILE

TRY_TO_FILE

访问器

FL_GET_CONTENT_TYPE

FL_GET_ETAG

FL_GET_FILE_TYPE

FL_GET_LAST_MODIFIED

FL_GET_RELATIVE_PATH

FL_GET_SCOPED_FILE_URL

FL_GET_SIZE

FL_GET_STAGE

FL_GET_STAGE_FILE_URL

效用函数。

FL_IS_AUDIO

FL_IS_COMPRESSED

FL_IS_DOCUMENT

FL_IS_IMAGE

FL_IS_VIDEO

使用说明

  • FILE 值可能会与基础暂存文件不一致。当您修改或删除基础文件时,FILE 值不会更新。反之,如果从表中删除 FILE 值,则基础文件不会受到影响。

  • 基础文件的权限由创建 FILE 时指定的 URL 类型控制。暂存区文件 URLs 和暂存区/路径组合为有权访问关联暂存区的调用者提供永久权限。作用域 URLs 允许用户在 24 小时内临时访问基础文件。

通过 SQL 在 Snowflake 中使用非结构化数据

创建一个包含 FILE 列的表:

CREATE TABLE images_table(img FILE);
Copy

从包含图像文件的外部暂存区 my_images 将数据加载到表中。mpy_images 可以是内部或外部暂存区。

备注

此过程需要暂存区上的目录表支持。如有必要,使用以下 SQL 命令启用它:

ALTER STAGE my_images DIRECTORY=(ENABLE=true);
Copy

将数据加载到 Snowflake 表中。

INSERT INTO images_table
    SELECT TO_FILE(file_url) FROM DIRECTORY(@my_images);
Copy

针对 images_table 运行 SQL 语句。例如,以下查询返回表中所有在 2021 年 1 月 1 日至 2023 年 1 月 1 日之间最后修改的文件的相对路径。

SELECT FL_GET_RELATIVE_PATH(f)
    FROM images_table
    WHERE FL_GET_LAST_MODIFIED(f) BETWEEN '2021-01-01' and '2023-01-01';
Copy

已知限制

FILE 数据类型目前无法用于以下场景:

  • CLUSTER BY、GROUP BY 和 ORDER BY 子句

  • 混合表、Iceberg 表和外部表

  • SnowScript

  • 安全视图

  • 绑定

  • 搜索优化

  • 除 Snowpark Python 之外的客户端和连接器

语言: 中文