更新时间:2026-08-06 GMT+08:00
分享

Lance on Aura DDL语法说明

使用限制

Lance表不支持创建partition和bucket列。

创建Lance表

用户使用CREATE TABLE语法创建Lance表,需指定STORE AS Lance。具体语法,请参见CREATE TABLE。用户创建的Lance表元数据存储于LakeFormation中,主要包含表名、表路径、表当前版本号和表参数,Lance表实际数据文件存储于OBS桶中。

示例:

1
2
3
4
5
6
7
8
9
CREATE TABLE lance_tbl(
col1 int,
col2 array<double>,
col3 bytea
) 
TABLEPROPERTIES (
'enable.blob.col3'='true',
'arrow.fixed-size-list.col2' = '128' 
) STORE AS Lance;

TABLEPROPERTIES支持配置的表参数:

表1

参数

类型

说明

enable.blob.col_name

布尔值

指定col_name列为BLOB列,仅支持bytea类型列,Lance中对于BLOB的介绍请参见:Lance BLOB格式介绍

arrow.fixed-size-list.col_name

整型值

范围为1~2147483647,指定col_name使用Arrow中的FixedSizeList存储为定长向量,仅支持浮点数类型的一维数组。

max.rows.per.file

整型值

范围为1~9223372036854775807,默认值为1048576,指定单个文件写入最大行数。

max.bytes.per.file

整型值

范围为1~9223372036854775807,默认值为90GiB,指定单个文件写入最大字节数。

lance.encoding.compression

整型值

字符串,可指定为zstd、lz4、fsst三种压缩算法,其中zstd支持配置压缩等级,取值范围为0-22,如果未指定压缩等级则默认压缩等级为3,默认不启用压缩。三种压缩方式的介绍,请参见Lance支持压缩方式介绍

lance.batch.readahead

整型值

范围为1~9223372036854775807,默认值为4,指定预读的Batch数目。

lance.fragment.readahead

整型值

范围为1~9223372036854775807,默认值为32,指定预读的Fragment数目。

lance.storage.version

字符串

可取值为0.1、2.0、2.1、2.2,指定存储的Lance格式版本,默认值为2.2。

lance.block.size

整型值

范围为1~34359738368,指定向存储层发起单次I/O请求的最小字节数,默认值为1MB。

metadata.cache.size

整型值

范围为1~34359738368,指定元数据缓存大小字节数,默认值为1GiB。

io.buffer.size

整型值

范围为1~34359738368,指定I/O缓冲区大小字节数,默认值为2GiB。

index.cache.size

整型值

范围为1~34359738368,指定索引缓存大小字节数,默认值为6GiB。

清空Lance表

通过TRUNCATE TABLE语法清空表中的数据。具体语法,请参见TRUNCATE

示例:

1
TRUNCATE TABLE lance_tbl;

清理Lance表历史版本

通过VACUUM TABLE语法清理Lance表的历史版本及不再被引用的数据文件、事务文件、索引文件,回收OBS存储空间。Lance表在执行INSERT/UPDATE/DELETE/INSERT OVERWRITE/ALTER INDEX OPTIMIZE等操作后会产生新版本,旧版本及其引用的文件会持续保留,可通过VACUUM TABLE清理。

支持的清理选项:

  • older_than_seconds:整型值,范围为1~31536000,仅清理产生时间超过该秒数的旧版本。省略时Lance内核使用默认值(14 天)。
  • delete_rate_limit:整型值,范围为1~2147483647,删除操作的限速(次/秒),用于避免触发OBS限流。

VACUUM TABLE返回一行清理统计结果,包含6个字段:

表2 字段说明

字段

类型

说明

bytes_removed

bigint

清理释放的字节数。

old_versions

integer

清理的旧版本数。

data_files_removed

integer

清理的数据文件数。

transaction_files_removed

integer

清理的事务文件数。

index_files_removed

integer

清理的索引文件数。

deletion_files_removed

integer

清理的删除标记文件数量。

示例:

清理2秒前产生的旧版本:

1
VACUUM TABLE lance_tbl WITH (older_than_seconds = 2);

使用默认参数(Lance内核默认清理14天前的旧版本):

1
VACUUM TABLE lance_tbl;

Lance表数据压缩

通过Compaction操作对Lance表进行数据重写(Rewrite Data),将多个小Fragment合并为较大的Fragment,并按配置重新组织Fragment内部的Row Group,从而减少Fragment数量、降低元数据开销并优化查询性能。Lance表在多次执行 INSERT、DELETE 等操作后会产生多个Fragment以及删除标记文件(Deletion File),通过Compaction可以合并小Fragment,并根据配置选择是否物化删除(Materialize Deletions)已标记删除的数据。

支持的Compaction选项如下表所示:

表3 参数说明

字段

类型

取值范围

默认值

说明

target_rows_per_fragment

bigint

[1, int32)

1048576(约100万行)

Compaction会以该值作为目标 Fragment行数,对满足条件的 Fragment进行重写,使生成的新 Fragment 的行数尽可能接近该值(并非严格等于,也并非所有小于该值的Fragment都一定会被单独合并)。

max_rows_per_group

bigint

[1, int32)

1024

每个Fragment内部Row Group(Arrow RecordBatch)的最大行数。当Fragment的行数超过该值时,会被划分为多个Row Group。

max_bytes_per_file

bigint

[1, int64)

write_dataset默认值

单个.lance文件允许的最大字节大小。

materialize_deletions

boolean

true/false

true

是否在Compaction时物化删除(Materialize Deletions)已标记删除的数据。

  • 设置为true时,会将删除的数据从新的Fragment中移除。
  • 设置为false时,会保留删除标记文件(Deletion File)并继续引用原有 Fragment。

materialize_deletions_threshold

real

[0.0, 1.0]

0.1 (10%)

当materialize_deletions=true 时,仅删除比例超过该阈值的Fragment会执行物化删除。删除比例 = 已删除行数 / Fragment总行数

num_threads

bigint

[0, int32)

CPU核心数

compaction执行时使用的线程数(控制CPU并行度)。当设置为0或未指定时,将自动使用当前机器的CPU Core数。

batch_size

bigint

[0, int32)

scanner默认值

Scanner每次读取的数据Batch大小(影响内存占用和处理速度)。

defer_index_remap

boolean

true/false

false

是否延迟执行索引重映射(Index Remapping)。设置为 true 时,Compaction不会立即更新关联索引,而是记录Fragment的映射关系,由后续操作完成索引重映射,可减少 Compaction 的执行时间

max_source_fragments

bigint

[0, int32)

无限制

单个Compaction Task最多允许参与合并的源Fragment数量,用于限制一次重写的数据规模。

示例:

基本用法:

1
OPTIMIZE lance_table REWRITE DATA;

指定目标Fragment数:

OPTIMIZE lance_table REWRITE DATA WITH OPTIONS ('target_rows_per_fragment' = '10000');

多参数配置:

OPTIMIZE lance_table REWRITE DATA  WITH OPTIONS (    'target_rows_per_fragment' = '10000',    'materialize_deletions' = 'true',    'materialize_deletions_threshold' = '0.2',    'max_source_fragments' = '50');

删除Lance表

通过DROP TABLE语法删除Lance表,会同时删除表的元数据及数据(Managed表删除后可以从LakeFormation控制台恢复表的元数据及数据)。具体语法,请参见DROP TABLE

示例:

1
DROP TABLE lance_tbl;

修改表中的列

  • 添加列:

    向一个指定表中添加一列或者多列,需要指定列名和数据类型,添加的列会追加到表的当前列后面。

    ALTER TABLE tbl_name ADD COLUMN col1 typ1, col2 typ2, ....;
  • 删除列:

    删除一个指定表的一列或者多列,不能删除一个表的所有列。

    ALTER TABLE tbl_name DROP COLUMNS (col1, col2,...);
  • 重命名列:

    重命名一个指定的列名,不能同时重命名多列。

    ALTER TABLE tbl_name RENAME COLUMN old_name TO new_name;
  • 更改列类型:

    更改一个或多个指定列的数据类型为另一个类型。

    ALTER TABLE tbl_name ALTER COLUMN a TYPE new_type, b TYPE new_type, ...;

    当前仅支持从低精度类型更新到高精度类型,不支持以下范围之外的类型转换:

    • 整数类型:从smallint更新到int或者bigint,从int更新到bigint。
    • 浮点类型:从float4更新到float8。
    • numeric类型:从低精度(precision)更新到高精度(precision),不支持更新小数位数(scale)。
    • 字符串类型:varchar或者char的长度变长。

修改表参数

  • 添加或修改参数:

    仅支持max.rows.per.file、max.bytes.per.file、lance.encoding.compression三个参数。

    ALTER TABLE tbl_name SET TABLEPROPERTIES('max.rows.per.file'='1024', 'max.bytes.per.file'='2048', 'lance.encoding.compression'='zstd');
  • 移除表参数:

    仅支持max.rows.per.file、max.bytes.per.file、lance.encoding.compression三个参数。

    ALTER TABLE tbl_name UNSET TABLEPROPERTIES('max.rows.per.file', 'max.bytes.per.file', 'lance.encoding.compression');

相关文档