DB4AI-Snapshots数据版本管理
DB4AI-Snapshots是DB4AI模块用于管理数据集版本的功能。通过DB4ai-Snapshots组件,开发者可以简单、快速地进行特征筛选、类型转换等数据预处理操作,同时还可以像git一样对训练数据集进行版本控制。数据表快照创建成功后可以像视图一样进行使用,但是一经发布后,数据表快照便固化为不可变的静态数据,如需修改该数据表快照的内容,需要创建一个版本号不同的新数据表快照。
DB4AI-Snapshots的生命周期
DB4AI-Snapshots的状态包括published、archived以及purged。其中,published可以用于标记该DB4AI-Snapshots 已经发布,可以进行使用。archived表示当前 DB4AI-Snapshots 处于“存档期”,一般不进行新模型的训练,而是利用旧数据对新的模型进行验证。purged则是该DB4AI-Snapshots 已经被删除的状态,在数据库系统中无法再检索到。
需要注意的是快照管理功能是为了给用户提供统一的训练数据,不同团队成员可以使用给定的训练数据来重新训练机器学习模型,方便用户间协同。为此私有用户和三权分立状态(enableSeparationOfDuty=ON)等涉及不支持用户数据转写等情况将不支持Snapshot特性。
用户可以通过“CREATE SNAPSHOT”语句创建数据表快照,创建好的快照默认即为published状态。可以采用两种模式创建数据表快照,即为MSS以及CSS模式,它们可以通过GUC参数db4ai_snapshot_mode进行配置。对于MSS模式,它是采用物化算法进行实现的,存储了原始数据集的数据实体;CSS则是基于相对计算算法实现的,存储的是数据的增量信息。数据表快照的元信息存储在DB4AI的系统目录中。可以通过db4ai.snapshot 系统表查看到。
可以通过“ARCHIVE SNAPSHOT”语句将某一个数据表快照标记为archived状态,可以通过“PUBLISH SNAPSHOT”语句将其再度标记为published状态。标记数据表快照的状态,是为了帮助数据科学家进行团队合作使用的。
当一个数据表快照已经丧失存在价值时,可以通过“PURGE SNAPSHOT”语句删除它,以便永久删除其数据并恢复存储空间。
DB4AI-Snapshots使用指导
- 创建表以及插入表数据。
数据库内存在已有的数据表,可根据该已有的数据表创建对应的数据表快照。为了后续演示,在此处新建一个名为 t1 的数据表,并向其中插入测试数据。
1. create table t1 (id int, name varchar);
2. insert into t1 values (1, 'zhangsan');
3. insert into t1 values (2, 'lisi');
4. insert into t1 values (3, 'wangwu');
5. insert into t1 values (4, 'lisa');
6. insert into t1 values (5, 'jack');
通过SQL语句,查询搭配数据表内容。
1. SELECT * FROM t1;
2. id | name
3. ----+----------
4. 1 | zhangsan
5. 2 | lisi
6. 3 | wangwu
7. 4 | lisa
8. 5 | jack
9. (5 rows)
2. 使用DB4AI-Snapshots。
-
创建DB4AI-Snapshots
- 示例1:CREATE SNAPSHOT…AS
示例如下,其中,默认版本分隔符为 “@”, 默认子版本分割符为 “.”,该分割符可以分别通过GUC参数db4ai_snapshot_version_delimiter以及db4ai_snapshot_version_separator进行设置。
1. create snapshot s1@1.0 comment is 'first version' as select * from t1; 2. schema | name 3. --------+-------- 4. public | s1@1.0 5. (1 row)上述结果提示已经创建了数据表 s1的快照,版本号为 1.0。创建好后的数据表快照可以像使用一般视图一样进行查询,但不支持通过“INSERT INTO”语句进行更新。例如下面几种语句都可以查询到数据表快照s1的对应版本 1.0的内容:
1. SELECT * FROM s1@1.0; 2. SELECT * FROM public.s1@1.0; 3. SELECT * FROM public . s1 @ 1.0; 4. id | name 5. ----+---------- 6. 1 | zhangsan 7. 2 | lisi 8. 3 | wangwu 9. 4 | lisa 10. 5 | jack 11. (5 rows)可以通过下列SQL语句修改数据表t1的内容:
1. UPDATE t1 SET name = 'tom' where id = 4; 2. insert into t1 values (6, 'john'); 3. insert into t1 values (7, 'tim');再检索数据表t1的内容时,发现虽然数据表t1的内容已经发生变化,但是数据表快照 s1@1.0 版本的查询结果并未发生变化。由于数据表t1的数据已经发生了改变,如果将当前数据表的内容作为版本2.0,则可创建快照s1@2.0,创建的SQL语句如下:
1. create snapshot s1@2.0 as select * from t1;通过上述例子,我们可以发现,数据表快照可以固化数据表的内容,避免中途对数据的改动造成机器学习模型训练时的不稳定,同时可以避免多用户同时访问、修改同一个表时造成的锁冲突。 - 示例2:CREATE SNAPSHOT…FROM
SQL语句可以对一个已经创建好的数据表快照进行继承,利用在此基础上进行的数据修改产生一个新的数据表快照。例如:
1. create snapshot s1@3.0 from @1.0 comment is 'inherits from @1.0' using (INSERT VALUES(6, 'john'), (7, 'tim'); DELETE WHERE id = 1); 2. schema | name 3. --------+-------- 4. public | s1@3.0 5. (1 row)其中,“@”为数据表快照的版本分隔符,from子句后加上已存在的数据表快照,用法为“@”+版本号,USING关键字后加入可选的几个操作关键字(INSERT …/UPDATE …/DELETE …/ALTER …),其中 “INSERT INTO”以及“DELETE FROM”语句中的“INTO”、“FROM”等与数据表快照名字相关联的子句可以省略,具体可以参考AI特性函数。
示例中,基于前述s1@1.0快照,插入2条数据,删除1条新的数据,新生成的快照s1@3.0,检索该s1@3.0:
1. SELECT * FROM s1@3.0; 2. id | name 3. ----+---------- 4. 2 | lisi 5. 3 | wangwu 6. 4 | lisa 7. 5 | jack 8. 6 | john 9. 7 | tim 10. (7 rows)- 删除数据表快照SNAPSHOT1. purge snapshot s1@3.0; 2. schema | name 3. --------+-------- 4. public | s1@3.0 5. (1 row)此时,已经无法再从s1@3.0 中检索到数据了,同时该数据表快照在db4ai.snapshot视图中的记录也会被清除。删除该版本的数据表快照不会影响其他版本的数据表快照。 - 从数据表快照中采样
示例:从snapshot s1中抽取数据,使用0.5抽样率。
1. sample snapshot s1@2.0 stratify by name as nick at ratio .5; 2. schema | name 3. --------+------------ 4. public | s1nick@2.0 5. (1 row)可以利用该功能创建训练集与测试集,例如:
1. SAMPLE SNAPSHOT s1@2.0 STRATIFY BY name AS _test AT RATIO .2, AS _train AT RATIO .8 COMMENT IS 'training'; 2. schema | name 3. --------+---------------- 4. public | s1_test@2.0 5. public | s1_train@2.0 6. (2 rows)- 发布数据表快照采用下述SQL语句将数据表快照 s1@2.0 标记为published 状态:
1. publish snapshot s1@2.0; 2. schema | name 3. --------+-------- 4. public | s1@2.0 5. (1 row)- 存档数据表快照采用下述语句可以将数据表快照标记为 archived 状态:
1. archive snapshot s1@2.0; 2. schema | name 3. --------+-------- 4. public | s1@2.0 5. (1 row)可以通过db4ai-snapshots提供的视图查看当前数据表快照的状态以及其他信息:
1. select * from db4ai.snapshot; 2. id | parent_id | matrix_id | root_id | schema | name | owner | commands | comment | published | archived | created | row_count 3. ----+-----------+-----------+---------+--------+------------+--------+------------------------------------------+---------+-----------+----------+----------------------------+----------- 4. 1 | | | 1 | public | s1@2.0 | omm | {"select *","from t1 where id > 3",NULL} | | t | f | 2021-04-17 09:24:11.139868 | 2 5. 2 | 1 | | 1 | public | s1nick@2.0 | omm | {"SAMPLE nick .5 {name}"} | | f | f | 2021-04-17 10:02:31.73923 | 03. 异常场景 -
数据表或db4ai-snapshots不存在时。
``` 1. purge snapshot s1nick@2.0; 2. publish snapshot s1nick@2.0; 3. --------- 4. ERROR: snapshot public."s1nick@2.0" does not exist 5. CONTEXT: PL/pgSQL function db4ai.publish_snapshot(name,name) line 11 at assignment
- archive snapshot s1nick@2.0;
-
- ERROR: snapshot public."s1nick@2.0" does not exist
- CONTEXT: PL/pgSQL function db4ai.archive_snapshot(name,name) line 11 at assignment ```
- 删除snapshot时,有依赖该快照的其他snapshot,需先确保删除对本快照所依赖的其他快照。
1. purge snapshot s1@1.0; 2. ERROR: cannot purge root snapshot 'public."s1@1.0"' having dependent snapshots 3. HINT: purge all dependent snapshots first 4. CONTEXT: referenced column: purge_snapshot_internal 5. SQL statement "SELECT db4ai.purge_snapshot_internal(i_schema, i_name)" 6. PL/pgSQL function db4ai.purge_snapshot(name,name) line 71 at PERFORM4. 相关GUC参数 -
db4ai_snapshot_mode:
Snapshot有2种模式:MSS(物化模式,存储数据实体)和CSS(计算模式,存储增量信息)。Snapshot可在MSS和CSS之间切换快照模式,默认是MSS模式。 - db4ai_snapshot_version_delimiter:
该参数为数据表快照版本分隔符。“@”为数据表快照的默认版本分隔符。 - db4ai_snapshot_version_separator
该参数为数据表快照子版本分隔符。“.”为数据表快照的默认版本分隔符。 5. DB4AI Schema下的数据表快照详情db4ai.snapshot。
1. openGauss=# \d db4ai.snapshot
2. Table "db4ai.snapshot"
3. Column | Type | Modifiers
4. -----------+-----------------------------+---------------------------
5. id | bigint |
6. parent_id | bigint |
7. matrix_id | bigint |
8. root_id | bigint |
9. schema | name | not null
10. name | name | not null
11. owner | name | not null
12. commands | text[] | not null
13. comment | text |
14. published | boolean | not null default false
15. archived | boolean | not null default false
16. created | timestamp without time zone | default pg_systimestamp()
17. row_count | bigint | not null
18. Indexes:
19. "snapshot_pkey" PRIMARY KEY, btree (schema, name) TABLESPACE pg_default
20. "snapshot_id_key" UNIQUE CONSTRAINT, btree (id) TABLESPACE pg_default
说明: 命名空间DB4AI是本功能的私有域,不支持在DB4AI的命令空间下创建函数索引(functional index)。
说明: 命名空间DB4AI是本功能的私有域,不支持在DB4AI的命令空间下创建函数索引(functional index)。