更新时间:2022-02-22 GMT+08:00

删除Segments

操作场景

如果用户将错误数据加载到表中,或者数据加载后出现许多错误记录,用户希望修改并重新加载数据时,可删除对应的segment。可使用segment ID来删除segment,也可以使用加载数据的时间来删除segment。

删除segment操作只能删除未合并的segment,已合并的segment可以通过CLEAN FILES命令清除segment。

通过Segment ID删除

每个Segment都有与其关联的唯一Segment ID。使用这个Segment ID可以删除该Segment。

  1. 运行如下命令获取Segment ID。

    命令:

    SHOW SEGMENTS FOR Table dbname.tablename LIMIT number_of_loads;

    示例:

    SHOW SEGMENTS FOR TABLE carbonTable;

    上述命令可显示tablename为carbonTable的表的所有Segment信息。

    SHOW SEGMENTS FOR TABLE carbonTable LIMIT 2;

    上述命令可显示number_of_loads规定条数的Segment信息。

    输出结果如下:

    +-----+----------+--------------------------+------------------+------------+------------+-------------+--------------+--+
    | ID  |  Status  |     Load Start Time      | Load Time Taken  | Partition  | Data Size  | Index Size  | File Format  |
    +-----+----------+--------------------------+------------------+------------+------------+-------------+--------------+--+
    | 3   | Success  | 2020-09-28 22:53:26.336  | 3.726S           | {}         | 6.47KB     | 3.30KB      | columnar_v3  |
    | 2   | Success  | 2020-09-28 22:53:01.702  | 6.688S           | {}         | 6.47KB     | 3.30KB      | columnar_v3  |
    +-----+----------+--------------------------+------------------+------------+------------+-------------+--------------+--+

    SHOW SEGMENTS命令输出包括ID、Status、Load Start Time、Load Time Taken、Partition、Data Size、Index Size、File Format。最新的加载信息在输出中第一行显示。

  2. 获取到需要删除的Segment的Segment ID后,执行如下命令删除对应Segment:

    命令:

    DELETE FROM TABLE tableName WHERE SEGMENT.ID IN (load_sequence_id1, load_sequence_id2, ....);

    示例:

    DELETE FROM TABLE carbonTable WHERE SEGMENT.ID IN (1,2,3);

    详细信息,请参阅DELETE SEGMENT by ID

通过加载数据的时间删除

用户可基于特定的加载时间删除数据。

命令:

DELETE FROM TABLE db_name.table_name WHERE SEGMENT.STARTTIME BEFORE date_value;

示例:

DELETE FROM TABLE carbonTable WHERE SEGMENT.STARTTIME BEFORE '2017-07-01 12:07:20';

上述命令可删除'2017-07-01 12:07:20'之前的所有segment。

有关详细信息,请参阅DELETE SEGMENT by DATE

删除结果

数据对应的segment被删除,数据将不能再被访问。可通过SHOW SEGMENTS命令显示segment状态,查看是否成功删除。

  • 调用DELETE SEGMENT命令时,物理上而言,Segment并没有从文件系统中被删除。使用命令SHOW SEGMENTS查看Segment信息,可看见被删除的Segment的状态被标识为"Marked for Delete"。但使用SELECT * FROM tablename命令查询时,不会显示被删除的Segment的内容。
  • 下一次加载数据且达到最大查询执行时间(由“max.query.execution.time”配置,默认为“60分钟”)后,Segment才会从文件系统中真正删除。
  • 如果用户想要强制删除物理Segment文件,那么可以使用CLEAN FILES命令。

    示例:

    CLEAN FILES FOR TABLE table1;

    该命令将从物理上删除状态为“Marked for delete”的Segment文件。

    如果在“max.query.execution.time”规定的时间到达之前使用该命令,可能会导致查询失败。“max.query.execution.time”可在“carbon.properties”文件中设置,表示一次查询允许花费的最长时间。