删除CarbonData表Segments
操作场景
如果用户将错误数据加载到表中,或者数据加载后出现许多错误记录,用户希望修改并重新加载数据时,可删除对应的segment。可使用segment ID来删除segment,也可以使用加载数据的时间来删除segment。
删除segment操作只能删除未合并的segment,已合并的segment可以通过CLEAN FILES命令清除segment。
通过Segment ID删除
每个Segment都有与其关联的唯一Segment ID。使用这个Segment ID可以删除该Segment。
- 运行如下命令获取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。最新的加载信息在输出中第一行显示。
- 获取到需要删除的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”文件中设置,表示一次查询允许花费的最长时间。