
# 配置Hudi历史数据清理
#### 操作场景
随着时间的推移，Hudi表中的数据越来越多，表中的老数据价值逐渐变弱，并且还会占用大量的存储空间。为了有效管理存储资源并节约成本，Hudi需要支持对这些老数据的删除操作。
#### 约束与限制
本章节仅适用于MRS 3.3.0-LTS及之后版本。
#### 执行delete/drop partition语句直接删除历史数据
使用delete/drop partition命令可以用来清理历史数据。
- delete语句用于删除表中的特定记录。在Hudi中，可以通过指定条件来删除符合条件的数据。例如，可以删除某个时间范围内的数据或特定分区的数据。
- drop partition语句用于删除表中的特定分区。分区是Hudi表中的一种组织方式，可以显著提高查询性能和数据管理的效率。通过删除分区，可以快速释放存储空间。
优点：操作简单，支持cow表和mor表。
缺点：并发能力不足。 当Hudi表处于实时写入状态，并发执行**delete/drop partition**命令容易导致实时入库作业失败。
delete/drop partition语句的使用具体可以参考[DELETE](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24276.html)和[Drop Partition](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300439.html)章节。
#### 执行call clean_data命令删除历史数据
call clean_data命令主要用于清理表中的旧数据文件，包括已删除的数据和过期的文件版本。通过定期执行call clean_data，可以确保Hudi表的高效运行和存储优化。在执行call clean_data之前，建议先备份重要数据，以防止误操作导致数据丢失。
- 命令功能 **call clean_data**的功能是用来删除mor表的历史数据。
  优点：可以和入库任务并发执行，不会影响实时入库数据。
  缺点：只支持mor表，并且是惰性删除，依赖于compaction。
  
- 命令格式 **call clean_data(table =\> 'table_name', sql =\> 'delete statement')**
  
- 参数描述
  表1参数描述 
  | **参数**           | **描述**                                |
  |:---|:---|
  | table_name       | 待删除数据的Hudi表名称，支持database.tablename格式。 |
  | delete statement | select类型的SQL语句，用于找出待删除的数据。            |
     
  
- 示例 从mytable表中删除primaryKey \< 100 的所有数据：
  ```
  call clean_data(table => 'mytable', sql=>'select *  from mytable where primaryKey < 100')
  ```
  清理上次clean_data命令残留文件；cleanData执行失败会产生临时文件，该命令可以清理这些临时文件：
  ```
  call clean_data(table => 'mytable', sql=>'delete cleanData')
  ```
  
- 系统响应 可在客户端中查看查询结果。
  
 
#### 相关文档
执行清理操作后，您可以查询Hudi表来检查数据是否已按预期清理，具体请参考[使用Spark SQL操作Hudi表](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300441.html)。
