文件存储(Volume)

Volume 是 Lakehouse 中管理文件的存储对象,用于存放 CSV、Parquet、JSON、图片等各类格式的文件。通过 Volume,你可以直接用 SQL 查询文件内容、上传下载文件、或将文件导入到表中。

类比:Volume 像 Lakehouse 的"文件系统"——你可以把文件放进去、直接查询、或导入到表中。与外部对象存储(OSS/S3)不同,Volume 是 Lakehouse 原生管理的存储对象,无需额外配置即可使用。

Volume 类型

Volume 分为内部 Volume外部 Volume 两大类:

类型分类创建方式存储位置适用场景
User Volume内部自动创建内部存储上传本地文件、临时存放待处理数据
Table Volume内部自动创建(每表一个)内部存储存放与该表相关的 ETL 文件
Named Volume内部
CREATE VOLUME
CREATE VOLUME
(用户显式创建)
内部存储团队共享文件、用户自管理生命周期
External Volume外部
CREATE EXTERNAL VOLUME
CREATE EXTERNAL VOLUME
外部存储(OSS/COS/S3)已有云存储数据,无需迁移直接访问

内部 Volume 数据存储在 Lakehouse 内部,按 Lakehouse 存储标准计费。其中 User Volume 和 Table Volume 由系统自动创建,Named Volume 由用户显式创建并自行管理生命周期。

外部 Volume 数据留在外部对象存储中不迁移,Lakehouse 仅存储路径元信息。

选型建议

场景推荐原因
从本地上传 CSV/Parquet 到 LakehouseUser Volume开箱即用,无需配置
已有 OSS/S3 数据,不想迁移External Volume直接挂载,零复制
团队共享文件目录Named Volume可配置共享权限
表相关的 ETL 中间文件Table Volume与表权限绑定,自动管理

核心机制

用户隔离:User Volume 是用户私有的,其他用户无法访问。

表关联:每张表自动关联一个 Table Volume,对 Table Volume 的操作需要对应表的权限。

外部挂载:External Volume 通过 Storage Connection 挂载 OSS/COS/S3,数据不迁入 Lakehouse,直接读取外部存储。

Volume 文件协议

除了 SQL 语句中的

FROM USER VOLUME
FROM USER VOLUME
FROM VOLUME vol_name
FROM VOLUME vol_name
等关键字语法,Lakehouse 还提供一套 Volume 文件协议,用于在字符串参数中引用 Volume 里的文件。这套协议主要用于:

  • 创建外部函数(
    CREATE EXTERNAL FUNCTION ... USING FILE/ARCHIVE
    CREATE EXTERNAL FUNCTION ... USING FILE/ARCHIVE
    )时指定代码包路径
  • Zettapark SDK 的
    session.file.put()
    session.file.put()
    /
    session.file.get()
    session.file.get()
    调用
  • 配置 Kerberos 认证文件路径(
    KERBEROS_KRB5_CONFIG_PATH
    KERBEROS_KRB5_CONFIG_PATH
    KERBEROS_KEYTAB_PATH
    KERBEROS_KEYTAB_PATH

协议格式总览

Volume 类型协议格式示例
External / Named Volume
volume://[workspace.][schema.]volume_name/path
volume://[workspace.][schema.]volume_name/path
volume://my_vol/udfs/upper.jar
volume://my_vol/udfs/upper.jar
User Volume
volume:user://~/path
volume:user://~/path
volume:user://~/upper.jar
volume:user://~/upper.jar
Table Volume
volume:table://[workspace.][schema.]table_name/path
volume:table://[workspace.][schema.]table_name/path
volume:table://my_table/data.csv
volume:table://my_table/data.csv

格式说明

External / Named Volume

volume://[{workspace}.][{schema}.]{volume_name}/{path_to_file}

  • workspace
    workspace
    schema
    schema
    :可选,省略时使用当前上下文默认值
  • volume_name
    volume_name
    :Volume 名称
  • path_to_file
    path_to_file
    :文件在 Volume 中的相对路径

-- 外部函数引用 Named Volume 中的 JAR 包 CREATE EXTERNAL FUNCTION upper_udf(s STRING) RETURNS STRING AS 'com.example.UpperUDF' USING CONNECTION my_api_conn USING FILE 'volume://fc_volume/udfs/upper.jar';

User Volume

volume:user://~/{path_to_file}

  • user
    user
    :固定关键字,表示 User Volume 协议
  • ~
    ~
    :固定值,代表当前登录用户
  • path_to_file
    path_to_file
    :文件在 User Volume 中的相对路径

-- 外部函数引用 User Volume 中的代码包 CREATE EXTERNAL FUNCTION sentiment(s STRING) RETURNS STRING AS 'com.example.Sentiment' USING CONNECTION my_api_conn USING ARCHIVE 'volume:user://~/sentiment.zip';

# Zettapark SDK 上传文件到 User Volume session.file.put("local/data.csv", "volume:user://~/csv/") # 从 User Volume 下载文件 session.file.get("volume:user://~/png/photo.png", "tmp/")

Table Volume

volume:table://[{workspace}.][{schema}.]{table_name}/{path_to_file}

  • table
    table
    :固定关键字,表示 Table Volume 协议
  • workspace
    workspace
    schema
    schema
    :可选,省略时使用当前上下文默认值
  • table_name
    table_name
    :关联表的名称
  • path_to_file
    path_to_file
    :文件在该表 Table Volume 中的相对路径

-- 外部函数引用 Table Volume 中的代码包 CREATE EXTERNAL FUNCTION process(s STRING) RETURNS STRING AS 'com.example.Process' USING CONNECTION my_api_conn USING FILE 'volume:table://my_schema.my_table/upper.jar';

SQL 关键字语法 vs 文件协议

这两套语法作用不同,不要混用:

用途语法形式示例
SQL 语句中操作 Volume 文件关键字语法
FROM USER VOLUME
FROM USER VOLUME
FROM VOLUME vol_name
FROM VOLUME vol_name
字符串参数中引用 Volume 文件路径文件协议
'volume:user://~/file.jar'
'volume:user://~/file.jar'

关键字语法用于

COPY INTO
COPY INTO
SELECT FROM VOLUME
SELECT FROM VOLUME
PUT
PUT
GET
GET
LIST
LIST
等 SQL 命令;文件协议用于需要传入字符串路径的场景(函数定义、SDK 调用、配置参数)。

快速示例

上传文件并查询

-- 上传本地 CSV 文件到 User Volume PUT '/Users/Downloads/taxi_zone_lookup.csv' TO USER VOLUME; -- 查看已上传的文件 SHOW USER VOLUME DIRECTORY; -- 结果: -- +----------------------+-----+------+----------------------------+ -- | relative_path | url | size | last_modified_time | -- +----------------------+-----+------+----------------------------+ -- | taxi_zone_lookup.csv | | 12331| 2026-05-21T10:00:00.000Z | -- +----------------------+-----+------+----------------------------+ -- 直接查询文件内容(无需导入到表) SELECT * FROM USER VOLUME USING CSV OPTIONS ('header' = 'true') FILES ('taxi_zone_lookup.csv') LIMIT 3; -- 结果: -- +------------+-------------+-----------------------+--------------+ -- | LocationID | Borough | Zone | service_zone | -- +------------+-------------+-----------------------+--------------+ -- | 1 | EWR | Newark Airport | EWR | -- | 2 | Queens | Jamaica Bay | Boro Zone | -- | 3 | Bronx | Allerton/Pelham Gardens| Boro Zone | -- +------------+-------------+-----------------------+--------------+

导入文件到表

-- 创建目标表 CREATE TABLE IF NOT EXISTS taxi_zones ( LocationID INT, Borough STRING, Zone STRING, service_zone STRING ); -- 从 User Volume 导入数据 COPY INTO taxi_zones FROM USER VOLUME USING CSV OPTIONS ('header' = 'true') FILES ('taxi_zone_lookup.csv'); -- 验证导入结果 SELECT COUNT(*) AS cnt FROM taxi_zones; -- 结果: -- +-----+ -- | cnt | -- +-----+ -- | 265 | -- +-----+

文件查询与访问函数

除了

COPY INTO
COPY INTO
SELECT FROM VOLUME
SELECT FROM VOLUME
,Lakehouse 还提供以下函数和命令操作 Volume 中的文件:

LIST — 列出文件

列出 Volume 中的文件,支持子目录过滤和正则匹配。与

SHOW VOLUME DIRECTORY
SHOW VOLUME DIRECTORY
相比,
LIST
LIST
支持正则过滤,更适合脚本化处理。

-- 列出 User Volume 中所有文件 LIST USER VOLUME; -- 列出外部 Volume 中指定子目录下的 Parquet 文件 LIST VOLUME my_oss_volume SUBDIRECTORY 'orders/2024/' REGEXP = '.*\.parquet'; -- 列出 Table Volume 中的文件 LIST TABLE VOLUME my_table;

详细语法参考:LIST


DIRECTORY() — 查询文件元数据

DIRECTORY()
DIRECTORY()
是一个表函数,将 Volume 的文件目录作为一张虚拟表返回,可以在
SELECT
SELECT
中使用,适合与
GET_PRESIGNED_URL
GET_PRESIGNED_URL
组合批量生成访问链接,或筛选特定文件后再处理。

-- 查看外部 Volume 中所有文件的元数据 SELECT * FROM DIRECTORY(VOLUME my_oss_volume); -- 返回列:relative_path、size、last_modified、file_url 等 -- 筛选特定格式的文件 SELECT relative_path, size FROM DIRECTORY(VOLUME my_oss_volume) WHERE relative_path LIKE '%.parquet';


GET_PRESIGNED_URL() — 生成预签名访问链接

为 Volume 中的文件生成带时效的预签名 URL,让外部应用(浏览器、Remote Function、AI 服务等)可以直接访问文件,无需暴露存储凭据。

-- 为单个文件生成有效期 1 小时的预签名 URL SELECT GET_PRESIGNED_URL(VOLUME my_oss_volume, 'images/photo.jpg', 3600) AS url; -- 批量为 User Volume 中所有图片生成预签名 URL SET cz.sql.function.get.presigned.url.force.external = true; SELECT relative_path, GET_PRESIGNED_URL(USER VOLUME, relative_path, 3600) AS url FROM (SELECT relative_path FROM (LIST USER VOLUME)) WHERE relative_path LIKE '%.jpg'; -- 结合 DIRECTORY() 批量生成(External Volume) SELECT GET_PRESIGNED_URL(VOLUME my_oss_volume, relative_path, 3600) AS url FROM DIRECTORY(VOLUME my_oss_volume);

详细语法参考:GET_PRESIGNED_URL


函数对比速查

函数 / 命令用途适用 Volume 类型
SHOW VOLUME DIRECTORY
SHOW VOLUME DIRECTORY
查看文件列表(交互式)Named / External
SHOW TABLE VOLUME DIRECTORY
SHOW TABLE VOLUME DIRECTORY
查看表关联文件列表Table Volume
SHOW USER VOLUME DIRECTORY
SHOW USER VOLUME DIRECTORY
查看个人文件列表User Volume
LIST
LIST
列出文件,支持正则过滤全部
DIRECTORY()
DIRECTORY()
文件元数据作为表查询External(需开启)
GET_PRESIGNED_URL()
GET_PRESIGNED_URL()
生成带时效的文件访问链接全部

Volume 与 Pipe 的关系

Pipe 从对象存储持续导入数据时,底层依赖 Volume 访问文件:

Object Storage (OSS/COS/S3) ↑ [Volume] ── 挂载点,访问文件 ↑ [Pipe] ── 持续导入管道 ↑ [Table] ── Lakehouse 结构化数据

  • Volume 提供文件访问能力,挂载外部对象存储
  • Pipe 提供持续流转能力,监控 Volume 中的新文件并自动导入到表

-- 典型用法:Volume + Pipe 组合 CREATE EXTERNAL VOLUME my_vol LOCATION 'oss://bucket/data/' USING CONNECTION oss_conn; CREATE PIPE my_pipe VIRTUAL_CLUSTER = 'default' INGEST_MODE = 'LIST_PURGE' AS COPY INTO orders FROM VOLUME my_vol USING CSV;

Volume 与 Table 的关系

Volume 与 Table 之间存在双向数据流转:

Object Storage (OSS/COS/S3) ↑↓ [Volume] ── 挂载点,访问文件 ↑↓ COPY INTO ── 双向数据传输 ↑↓ [Table] ── Lakehouse 结构化数据

-- 从 Volume 导入到表 COPY INTO orders FROM VOLUME my_vol USING CSV; -- 从表导出到 Volume COPY INTO VOLUME my_vol SUBDIRECTORY 'export/' FROM orders FILE_FORMAT = (TYPE = PARQUET);

常见问题 1:上传文件后查询不到

问题

PUT
PUT
上传文件后,立即
SELECT FROM USER VOLUME
SELECT FROM USER VOLUME
查不到数据。

症状:文件列表显示已上传,但查询返回空结果。

解决

  • PUT
    PUT
    上传后文件立即可用,但需要指定正确的文件名(区分大小写)
  • 使用
    SHOW USER VOLUME DIRECTORY
    SHOW USER VOLUME DIRECTORY
    确认文件名和路径

常见问题 2:External Volume 文件列表不更新

问题:在 OSS 中上传了新文件,但

SELECT FROM DIRECTORY(VOLUME ...)
SELECT FROM DIRECTORY(VOLUME ...)
看不到。

症状:外部存储有新文件,但 Volume 查询结果仍是旧的。

解决

  • External Volume 默认不自动刷新目录缓存
  • 手动执行
    ALTER VOLUME <name> REFRESH
    ALTER VOLUME <name> REFRESH
    刷新目录
  • 或创建时开启
    DIRECTORY = (ENABLE = TRUE, AUTO_REFRESH = TRUE)
    DIRECTORY = (ENABLE = TRUE, AUTO_REFRESH = TRUE)

常见问题 3:User Volume 文件无法共享

问题:用户 A 上传的文件,用户 B 无法访问。

症状:用户 B 执行

SELECT FROM USER VOLUME
SELECT FROM USER VOLUME
返回空。

解决

  • User Volume 是用户私有的,其他用户无法访问
  • 如需共享,使用 Named Volume(
    CREATE VOLUME
    CREATE VOLUME
    )或 External Volume

成本影响

存储成本

  • User Volume 和 Table Volume 的文件存储在 Lakehouse 内部对象存储中,按实际占用空间计费
  • External Volume 的数据存储在外部对象存储(OSS/COS/S3)中,按云厂商标准计费
  • 从 User Volume 导入表后,文件仍保留在 Volume 中,如需节省存储可手动删除

计算成本

  • 直接查询 Volume 文件(
    SELECT FROM VOLUME
    SELECT FROM VOLUME
    )消耗 VCluster CRU
  • COPY INTO
    COPY INTO
    导入数据消耗 VCluster CRU,与数据量和格式复杂度相关

生命周期管理

创建 Volume(自动/手动)→ 上传/挂载文件 → 查询或导入 → 清理文件 → 删除 Volume(仅 Named/External) ↓ ↓ ↓ ↓ ↓ User/Table 自动创建 PUT/外部存储 SELECT/COPY REMOVE DROP VOLUME

创建和删除

-- User Volume 和 Table Volume 自动创建,无需手动操作 -- 创建 Named Volume(团队共享) CREATE VOLUME shared_files; -- 创建 External Volume(挂载 OSS) CREATE EXTERNAL VOLUME my_oss_vol LOCATION 'oss://my-bucket/data/' USING CONNECTION my_oss_conn DIRECTORY = (ENABLE = TRUE); -- 删除 Volume DROP VOLUME shared_files; DROP EXTERNAL VOLUME my_oss_vol;

相关文档

联系我们
预约咨询
微信咨询
电话咨询