User Stage
- RFC PR: datafuselabs/databend#8519
- Tracking Issue: datafuselabs/databend#8520
Summary
支持用户内部 Stage。
Motivation
Databend 仅支持命名的内部 Stage:
CREATE STAGE @my_stage;
COPY INTO my_table FROM @my_stage;
然而,命名的内部 Stage 在某些情况下使用起来很复杂。特别是对于那些只使用 Stage 来加载数据的用户。通过支持用户 Stage,他们可以更高效地复制数据:
COPY INTO my_table from @~;
Guide-level explanation
Databend 将增加对用户 Stage 的支持。每个 SQL 用户都将拥有自己的 Stage,可以通过 ~
来引用。
用户可以像使用命名 Stage 一样在任何地方使用 ~
:
COPY INTO my_table FROM @~;
LIST @~;
PRESIGN @~/data.csv;
REMOVE @~ PATTERN = 'ontime.*';
用户 Stage 是 SQL 用户的内部匿名 Stage,因此用户不能:
- 创建
- 删除
- 更改
并且用户不能为用户 Stage 设置格式选项。他们需要在 COPY
期间指定格式设置。
Reference-level explanation
Databend 现在有两种不同的 StageType
:
pub enum StageType {
Internal,
External,
}
Databend 将为内部 Stage 生成一个唯一的前缀,例如 stage/{stage_name}
。
我们将添加两种新的 Stage 类型:
pub enum StageType {
LegacyInternal,
External,
Internal,
User,
}
StageType::Internal
将弃用 StageType::LegacyInternal
。自此 RFC 起,我们将不再使用 StageType::LegacyInternal
创建新的 Stage。
Stage 前缀规则将是:
LegacyInternal
=>stage/{stage_name}
External
=> 指定的位置。Internal
=>stage/internal/{stage_name}
User
=>stage/user/{user_name}
注意:StageType::User
不会存储在 metasrv 中,而是在内存中直接构建。
Drawbacks
没有。
Rationale and alternatives
Preserve stage name prefix
为了简化,我们可以保留所有以 bend_internal_
为前缀的 Stage。用户无法创建和删除具有此前缀的 Stage。
通过添加此限制,我们可以更轻松地实现用户 Stage。每次用户尝试访问他们自己的用户 Stage 时,我们都会扩展到 bend_internal_user_<user_name>
。
以用户 root
为例:
COPY INTO my_table FROM @~;
将被转换为:
COPY INTO my_table FROM @bend_internal_user_root;
用户只能通过 @~
访问他们的用户 Stage。访问 @bend_internal_user_root
将始终返回错误。
Create stage with UUID in metasrv
我们可以为首次访问其用户 Stage 的用户创建一个带有 UUID 的 Stage。
Prior art
None
Unresolved questions
None
Future possibilities
Table Stage
我们可以像 Snowflake 一样引入表 Stage:
COPY INTO my_table FROM @#my_table;
Cleanup while drop users
删除用户时,应清除用户的 Stage。
Garbage Collection for user stage
我们可以支持用户 Stage 的垃圾回收,以便可以删除过时的文件。