Apache® Gravitino Lance REST Catalog(以下简称“Lance REST 服务”)提供一组兼容 Lance Namespace REST 规范的 HTTP API,用于管理 命名空间(Namespace) 与 表(Table) 的元数据。
Apache Gravitino, the names of other Apache projects, and the ASF logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.
典型场景包括:
说明
本功能目前处于白名单开放阶段,仅华北2(北京)及华东2(上海)区域支持使用。如需使用,请提交工单申请。开通后,您将获得服务访问端点(Endpoint),结合火山引擎访问密钥(AK/SK)即可在计算引擎中进行配置并使用。
服务的 REST 根路径固定包含 /lance,接口路径以 /lance/v1 开头:
https://{endpoint}/lance/lance/v1/...Lance REST 在路径中使用字符串 id 表示命名空间或表,默认使用分隔符(delimiter)$:
namespaceId:
{catalog}{catalog}${schema}tableId:{catalog}${schema}${table}分隔符可通过 query 参数 delimiter 传入(默认 $)。
$、@、# 等字符在 URL path 中需要进行百分号编码:
$ → %24@ → %40# → %23例如:demo_catalog$demo_schema 需处理为: demo_catalog%24demo_schema
说明
catalog$schema$table 的约定进行调用。你需要获取:
cn-beijing、cn-shanghai)在火山引擎托管环境中,Lance REST 服务采用火山引擎标准的 AK/SK 签名鉴权机制。请求通常需要包含:
Authorization: HMAC-SHA256 ...X-Date: YYYYMMDD'T'HHMMSS'Z'X-Expire: -1 | 0 | N(签名有效期控制)Region: {region}签名算法与实现细节请参考官方文档:https://www.volcengine.com/docs/6369/67269
环境变量(示例)
export LANCE_HOST='https://{endpoint}' export LANCE_BASE="${LANCE_HOST}/lance" export REGION='cn-beijing'
通用 Header(生产建议)
Header | 必选 | 示例 | 说明 |
|---|---|---|---|
| 是 |
| 服务 Region |
| 是 |
| 火山签名时间戳(UTC) |
| 是 |
| 火山 AK/SK 签名 |
| 视接口 |
| JSON 接口需要;Arrow 建表需要 |
通用 Query 参数
参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
| 否 |
| 多级命名空间/表 ID 的分隔符 |
| 否 | (空) | 分页标识 |
| 否 | (空) | 每页数量 |
错误响应(示例)
失败时通常返回 application/json 的错误结构(字段名以实际返回为准):
{ "code": 404, "error": "Table not found", "type": "NoSuchTableException", "instance": "demo_catalog$demo_schema$demo_table", "detail": "..." }
GET/lance/v1/namespace/{id}/list输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 父命名空间 ID;常见约定用 |
query |
| 否 |
| 分隔符 |
query |
| 否 |
| 分页标识 |
query |
| 否 |
| 每页数量 |
请求示例
curl --location "${LANCE_BASE}/v1/namespace/root/list" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}"
响应示例(200)
{ "namespaces": ["demo_catalog", "demo_catalog2"], "page_token": null }
POST/lance/v1/namespace/{id}/create输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 命名空间 ID;二级命名空间需进行 URL 编码( |
query |
| 否 |
| 分隔符 |
body |
| 否 |
| `create | |
body |
| 否 |
| 透传属性 |
请求示例:创建一级 namespace(catalog)
curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog/create" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{ "mode": "create", "properties": { "comment": "created-by-demo" } }'
请求示例:创建二级 namespace(schema)
curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/create" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{ "mode": "create", "properties": { "location": "tos://{bucket}/{prefix}/" } }'
响应示例(200)
{ "properties": { "key": "value" } }
POST/lance/v1/namespace/{id}/describe输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 命名空间 ID |
query |
| 否 |
| 分隔符 |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/describe" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{}'
响应示例(200)
{ "properties": { "location": "tos://{bucket}/{prefix}/" } }
POST/lance/v1/namespace/{id}/exists输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 命名空间 ID |
query |
| 否 |
| 分隔符 |
响应
200 OK(通常无响应体)404 Not Found(返回错误结构)POST/lance/v1/namespace/{id}/drop注意:删除命名空间通常是递归的且不可恢复,建议先在测试环境验证。
输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 命名空间 ID |
query |
| 否 |
| 分隔符 |
body |
| 否 |
| 不传默认 |
body |
| 否 |
| 不传默认 |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/drop" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{"mode":"FAIL","behavior":"RESTRICT"}'
响应示例(200)
{}
GET/lance/v1/namespace/{id}/table/list输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 二级命名空间(catalog + schema) |
query |
| 否 |
| 分隔符 |
query |
| 否 |
| 分页标识 |
query |
| 否 |
| 每页数量 |
请求示例
curl --location "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/table/list" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}"
响应示例(200)
{ "tables": ["demo_catalog$demo_schema$demo_table"], "page_token": null }
POST/lance/v1/table/{id}/create-empty输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 表 ID |
query |
| 否 |
| 分隔符 |
body |
| 是 |
| 表数据目录 |
body |
| 否 |
| 透传属性 |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table0/create-empty" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{ "location": "tos://{bucket}/{prefix}/demo_table0.lance", "properties": {"k": "v"} }'
响应示例(200)
{ "location": "tos://{bucket}/{prefix}/demo_table0.lance", "properties": {"key": "value"} }
POST/lance/v1/table/{id}/register输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 表 ID |
query |
| 否 |
| 分隔符 |
body |
| 是 |
| 表数据目录 |
body |
| 否 |
| 常用 `CREATE | |
body |
| 否 |
| 透传属性;服务端会补充 |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/register" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{ "location": "tos://{bucket}/{prefix}/demo_table.lance", "mode": "CREATE", "properties": { "desc": "demo", "lance.hms.write-schema": true } }'
响应示例(200)
{ "location": "tos://{bucket}/{prefix}/demo_table.lance", "properties": { "location": "tos://{bucket}/{prefix}/demo_table.lance", "lance.register": "true", "desc": "demo" } }
POST/lance/v1/table/{id}/deregister输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 表 ID |
query |
| 否 |
| 分隔符 |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/deregister" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{}'
响应示例(200)
{ "location": "tos://{bucket}/{prefix}/demo_table.lance", "properties": {"key": "value"} }
POST/lance/v1/table/{id}/exists输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 表 ID |
query |
| 否 |
| 分隔符 |
响应
200 OK(通常无响应体)404 Not Found(返回错误结构)POST/lance/v1/table/{id}/describe输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 表 ID |
query |
| 否 |
| 分隔符 |
body |
| 否 |
| 不传/ |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/describe" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}" \ --header 'Content-Type: application/json' \ --data '{}'
响应示例(200)
{ "location": "tos://{bucket}/{prefix}/demo_table.lance", "properties": {"key": "value"} }
POST/lance/v1/table/{id}/drop注意:该操作可能删除元数据与底层数据文件,请务必确认影响范围。LAS Catalog 默认不删除实际数据。
输入参数
位置 | 参数 | 必选 | 示例 | 说明 |
|---|---|---|---|---|
path |
| 是 |
| 表 ID |
query |
| 否 |
| 分隔符 |
请求示例
curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/drop" \ --header "Region: ${REGION}" \ --header "X-Date: {ts}" \ --header "Authorization: {auth}"
响应示例(200)
{ "id": ["demo_catalog", "demo_schema", "demo_table"], "location": "tos://{bucket}/{prefix}/demo_table.lance", "properties": {"key": "value"} }
Authorization/X-Date 是否按火山签名算法正确生成Region 是否与服务端 Region 一致host 与实际请求 host 一致{id} 是否正确拼接与 URL 编码(尤其是 $、@、#)/gravitino-lance)