
# 创建Tag和Branch
本章节介绍如何创建Iceberg Tag和Branch。Tag可用于保留重要的历史快照以用于审计目的。
#### 创建Tag
Tag可用于保留重要的历史快照以用于审计目的。可登录spark-sql客户端参考以下操作创建Tag：
- 每周保留1个快照，持续1个月。
  1. 获取current-snapshot-id：
     ```
     DESCRIBE EXTENDED local.db.table;
     ```
     例如，获取到的current-snapshot-id为"2767263131158701491"。
     
  
  2. 可以通过每周标记快照并将Tag保留期设置为一个月来实现。快照将被保留，且分支引用本身将保留1周。
     ```
     ALTER TABLE local.db.table CREATE TAG `EOW-01`  AS OF VERSION {current-snapshot-id} RETAIN 7 DAYS;
     ```
     
   
 
- 每月保留1个快照，持续6个月。
  可以通过每月标记快照并将Tag保留期设置为6个月来实现：
  ```
  ALTER TABLE local.db.table CREATE TAG `EOM-01` AS OF VERSION {current-snapshot-id} RETAIN 180 DAYS;
  ```
  
- 每年保留1个快照，永久保存。
  可以通过标记年度快照来实现。Branch和Tag的默认保留期是永久。
  ```
  ALTER TABLE local.db.table CREATE TAG `EOY-2025` AS OF VERSION {current-snapshot-id};
  ```
  
#### 创建Branch
创建Branch的流程如下：
1. 设置"write.wap.enabled"为"true"以开启创建和切换分支功能：
   ```
   ALTER TABLE local.db.table SET TBLPROPERTIES ( 'write.wap.enabled'='true');
   ```
   
2. 基于主表创建分支
   例如，基于快照3创建分支，该分支将被写入并保留1周：
   ```
   ALTER TABLE local.db.table CREATE BRANCH `audit-branch` AS OF VERSION {current-snapshot-id} RETAIN 7 DAYS;
   ```
   例如，创建一个临时的"test-branch"，保留7天，并保留该Branch上的最新2个快照：
   ```
   ALTER TABLE local.db.table CREATE BRANCH `test-branch` RETAIN 7 DAYS WITH SNAPSHOT RETENTION 2 SNAPSHOTS;
   ```
   
3. 切换分支并执行写入操作 可以切换分支去验证表功能或者数据质量等，不影响主表。
   切换分支：
   ```
   SET spark.wap.branch = audit-branch;
   ```
   写入数据：
   ```
   INSERT INTO local.db.table VALUES (3, 'c');
   ```
   
4. 指定某个分支更新主表的最新状态
   ```
   CALL local.system.fast_forward('local.db.table', 'main', 'audit-branch');
   ```
   
5. 主表执行schema evolution对所有分支都生效。

1. 登录安装了Spark客户端的节点，执行以下命令登录Spark客户端： 
   1. 切换至客户端安装目录：
      ```
      cd 客户端安装目录
      ```
      
   
   2. 配置环境变量：
      ```
      source bigdata_env
      ```
      
   
   3. 加载Spark组件环境变量：
      ```
      source Spark/component_env
      ```
      
   
   4. 认证用户，如果集群未启用Kerberos认证（普通模式）请跳过此操作：
      ```
      kinit 组件业务用户
      ```
      
   
   
   
   
2. 创建表并插入数据。 
   1. 创建表：
      ```
      CREATE TABLE local.db.table (id bigint, data string, col float);
      ```
      
   
   2. 向表中插入数据：
      ```
      INSERT INTO local.db.table VALUES (1, 'a', 1.0), (2, 'b', 2.0), (3, 'c', 3.0);
      ```
      
   
   3. 查询表数据：
      ```
      SELECT * FROM local.db.table;
      ```
      例如，查询结果为：
      ```
      -- 1   a   1.0 
      -- 2   b   2.0 
      -- 3   c   3.0
      ```
      
   
   
   
   
3. 创建分支指向当前快照： 
   ```
   ALTER TABLE local.db.table CREATE BRANCH test_branch;
   ```
   查询分支数据：
   ```
   SELECT * FROM local.db.table VERSION AS OF 'test_branch';
   ```
   例如，查询结果为：
   ```
   -- 1   a   1.0 
   -- 2   b   2.0 
   -- 3   c   3.0
   ```
   
   
4. 修改Schema，删除"col"列并添加一个名为"new_col"的新列。 
   1. 删除"col"列：
      ```
      ALTER TABLE local.db.table DROP COLUMN col;
      ```
      
   
   2. 添加一个名为"new_col"的新列：
      ```
      ALTER TABLE local.db.table ADD COLUMN new_col date;
      ```
      
   
   3. 向表中插入数据：
      ```
      INSERT INTO local.db.table VALUES (4, 'd', date('2024-04-04')), (5, 'e', date('2024-05-05'));
      ```
      
   
   4. 查询表数据：
      ```
      SELECT * FROM local.db.table;
      ```
      例如，查询结果为：
      ```
      -- 1   a   NULL 
      -- 2   b   NULL 
      -- 3   c   NULL 
      -- 4   d   2024-04-04 
      -- 5   e   2024-05-05
      ```
      
   
   
   
   
5. 查询分支快照： 
   - 方式一：
     ```
     SELECT * FROM local.db.table.branch_test_branch;
     ```
     
   
   - 方式二：
     ```
     SELECT * FROM local.db.table VERSION AS OF 'test_branch';
     ```
     
   
   
   例如，查询结果为：
   ```
   -- 1   a   NULL 
   -- 2   b   NULL 
   -- 3   c   NULL
   ```
   
   
6. 向分支中写入数据，需要使用主表最新的Schema： 
   ```
   INSERT INTO local.db.table.branch_test_branch VALUES (6, 'e', date('2024-06-06')), (7, 'g', date('2024-07-07'));
   ```
   查询分支数据：
   ```
   SELECT * FROM local.db.table VERSION AS OF 'test_branch';
   ```
   例如，查询结果为：
   ```
   -- 6   e   2024-06-06 
   -- 7   g   2024-07-07 
   -- 1   a   NULL 
   -- 2   b   NULL 
   -- 3   c   NULL
   ```
   
   
 
