更新时间:2025-12-26 GMT+08:00
分享

配置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语句的使用具体可以参考DELETEDrop Partition章节。

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') 
  • 系统响应

    可在客户端中查看查询结果。

相关文档