
# 创建表时指定表的生命周期
#### 功能描述
DLI提供了表生命周期管理功能，在创建表时指定表的生命周期。DLI会根据每张表的最后修改时间和表的生命周期来判断是否要回收此表。通过设置表的生命周期，可以帮助您更好的管理数目众多的表，自动清理长期不再使用的数据表，简化数据表的回收流程。同时支持数据恢复设置，避免因误操作丢失数据。
#### 表的回收规则
- 在创建表时通过TBLPROPERTIES指定表的生命周期。
  - **非分区表**
    如果表是非分区表，根据每张表的最后修改时间，经过生命周期时间后判断是否要回收此表。
    
  
  - **分区表**
    如果是分区表，则根据各分区的最后一次表数据被修改的时间（LAST_ACCESS_TIME）判断该分区是否该被回收。分区表的最后一个分区被回收后，该表不会被删除。
    分区表不支持设置分区级的生命周期，仅支持表级别的生命周期管理。
    
   
- 生命周期回收为每天定时启动，扫描全量分区。 生命周期回收为每天定时启动，扫描全量分区的最后一次表数据被修改的时间（LAST_ACCESS_TIME）需要超过生命周期指定的时间才回收。
  假设某个分区表生命周期为1天，该分区数据最后一次被修改的时间是2023年05月20日15时。如果在2023年05月20日15时之前扫描此表（不到一天），则不会回收表分区。如果2023年05月20日回收扫描时发现表分区最后一次表数据被修改的时间（LAST_ACCESS_TIME）超过生命周期指定的时间，则上述分区会被回收。
  
- 生命周期主要提供定期回收表或分区的功能，每天根据服务的繁忙程度，不定时回收。不能确保表或分区的生命周期到期后，立刻被回收。
- 删除表后，表的所有属性信息全部会删除，包括生命周期。新建同名表后，表的生命周期以新设置的属性为准。
 
#### 约束限制
- 表生命周期处于受限使用阶段，如需使用请提交工单申请开通。
- 使用生命周期前推荐您配置dli_data_clean_agency委托。 委托权限策略请参考[DLI常见场景的委托权限策略](https://support.huaweicloud.com/usermanual-dli/dli_01_0617.html)。
  如果没有配置dli_data_clean_agency委托，系统会默认读取DLI上一代系统委托dli_admin_agency，但是如果您的账户未配置dli_admin_agency，那么无法继续使用当前的表生命周期功能。
  您可以在IAM委托中查看您是否有dli_admin_agency的委托。
  
- 表生命周期功能支持Hive、DataSource语法创建表、多版本表，暂不支持跨源表、Carbon表。
- 生命周期单位为天，取值为正整数。
- 生命周期只能在表级别设置，不能在分区级设置。为分区表指定的生命周期，适用于该表所有的分区。
- 生命周期设置后，DLI表和OBS表支持数据备份，OBS表的备份目录需要手工设置。且备份目录应选择在并行文件系统上，备份目录必须和原表目录在同一个桶上，备份目录不能与原表相同目录或者子目录同名。
 
#### 语法格式
- **DataSource语法创建DLI表**
  ```
  CREATE TABLE table_name(name string, id int) 
  USING parquet 
  TBLPROPERTIES( "dli.lifecycle.days"=1 );
  ```
  
- **Hive语法创建DLI表**
  ```
  CREATE TABLE table_name(name string, id int) 
  stored as parquet 
  TBLPROPERTIES( "dli.lifecycle.days"=1 );
  ```
  
- **DataSource语法创建OBS表**
  ```
  CREATE TABLE table_name(name string, id int) 
  USING parquet 
  OPTIONS (path "obs://dli-test/table_name")
  TBLPROPERTIES( "dli.lifecycle.days"=1, "external.table.purge"='true', "dli.lifecycle.trash.dir"='obs://dli-test/Lifecycle-Trash' );
  ```
  
- **Hive语法创建OBS表**
  ```
  CREATE TABLE table_name(name string, id int) 
  STORED AS parquet 
  LOCATION 'obs://dli-test/table_name'
  TBLPROPERTIES( "dli.lifecycle.days"=1, "external.table.purge"='true', "dli.lifecycle.trash.dir"='obs://dli-test/Lifecycle-Trash' );
  ```
  
 
#### 关键字
- TBLPROPERTIES：表的属性，增加表的生命周期功能。
- OPTIONS：新建表的路径，适用于DataSource语法创建OBS表。
- LOCATION:新建表的路径，适用于Hive语法创建OBS表。
 
#### 参数说明
表1参数说明 
| 参数名称                    | 是否必选 | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|
| table_name              | 是    | 需要设置生命周期的表名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| dli.lifecycle.days      | 是    | 设置的生命周期时间，只能为正整数，单位为天。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| external.table.purge    | 否    | 仅OBS表支持配置该参数。 是否需要在删除表或分区时，清除path路径下的数据。默认不删除。 设置'external.table.purge'='true'时： - 非分区OBS表配置删除文件后，表目录也会删除。  - 分区OBS表自定义分区数据也会删除。   |
| dli.lifecycle.trash.dir | 否    | 仅OBS表支持配置该参数。 设置'external.table.purge'='true'时，清除数据的备份目录，默认七天后删除备份数据。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
#### 示例
- **DataSource语法新建test_datasource_lifecycle表，生命周期为100天**
  ```
  CREATE TABLE test_datasource_lifecycle(id int) 
  USING parquet 
  TBLPROPERTIES( "dli.lifecycle.days"=100);
  ```
  
- **Hive语法新建test_hive_lifecycle表，生命周期为100天。**
  ```
  CREATE TABLE test_hive_lifecycle(id int) 
  stored as parquet 
  TBLPROPERTIES( "dli.lifecycle.days"=100);
  ```
  
- **DataSource语法新建test_datasource_lifecycle_obs表，生命周期为100天，过期时默认删除数据且数据备份至目录'obs://dli-test** **/'** 。
  ```
  CREATE TABLE test_datasource_lifecycle_obs(name string, id int) 
  USING parquet 
  OPTIONS (path "obs://dli-test/xxx")
  TBLPROPERTIES( "dli.lifecycle.days"=100, "external.table.purge"='true', "dli.lifecycle.trash.dir"='obs://dli-test/Lifecycle-Trash' );
  ```
  
- **Hive语法新建test_hive_lifecycle_obs表，生命周期为100天，过期时默认删除数据且数据备份至目录'obs://dli-test/'** 。
  ```
  CREATE TABLE test_hive_lifecycle_obs(name string, id int) 
  STORED AS parquet 
  LOCATION 'obs://dli-test/xxx'
  TBLPROPERTIES( "dli.lifecycle.days"=100, "external.table.purge"='true', "dli.lifecycle.trash.dir"='obs://dli-test/Lifecycle-Trash' );
  ```
  
 
