clickhouse如何删除数据
clickhouse删除数据提供了三种方式:
一、是删除分区,数据就会删除掉二、是通过Alter语句删除数据
三、是还可以通过设置日期字段或表的TTL生命周期,到期自动清除数据
四、直接用delete from语句删除(22.8版本之后才有的功能)
1.删除分区
alter table 表名 drop partition 分区名
分区名可以用下语句查询select * from system.parts p where table = '表名'
以我下面这张表为例,分区函数是toYYYYMMDD(collect_time),按天分区,那分区名就是20201010这样的日期格式,只要按这样的分区名称删除分区即可删除数据,并且,重新导入数据不需要提前创建分区,分区会自动创建。
2.Alter语句删除数据
尽量用删除分区的方式删除数据,ck没有提供delete from语句,如果要删除或更新单条或批量只能用:ALTER TABLE 表名 DELETE WHERE 条件
ALTER TABLE 表名 UPDATE column1 = expr1 [, ...] WHERE filter_expr
但是以上语句是异步执行的,应用并不知道clickhouse何时能删除数据,如果要做到强一致性,需要应用反查确认。
(注意,上面的表名只能是本地表,如果想集群内所有机器一起删除,只能用分布式DDL来执行)
例如可以定时反查确认数据是否被删除:
clusterEngsCompClgResultMapper.deleteData(startTime, endTime);
Long waitTimes = 0L;
boolean isDelate = false;
while (waitTimes < 12){
//删除等待5秒
try {
Thread.sleep(5000L);
}catch (Exception e){
}
long count = clusterEngsCompClgResultMapper.selectCount(startTime, endTime);
//查询不到数据才表示删除成功(其实是已经标记成功),否则一直查询直到超时。
if(count == 0L){
isDelate = true;
break;
}
waitTimes++;
}
if(isDelate == false){
throw new Exception("Clickhouse delete data timeout");
}
上面的deleteData语句如下:
<update id="deleteData">
alter table engs_comp_clg_result_local on cluster shipin_cluster DELETE
WHERE storage_time >= #{startTime} <![CDATA[ and storage_time <= #{endTime} ]]>
</update>
上面演示的代码是我定时批处理往clickhouse导入前一天数据,导入前我需要删除对应数据,用来支持多次重复导入,上面的定时是为了确保ALTER TABLE DELETE真正删除完才往下导入数据。
3.TTL数据生命周期
没有用过,这里只提一下
4.新版中的轻量级删除数据:
DELETE FROM [db.]table [WHERE expr]
例如:DELETE FROM hits WHERE Title LIKE '%hello%';
默认情况下,轻量级删除是异步的,同样需要应用反查才能确认。不过,可以配置成同步的,将mutations_sync设为1,以等待一个副本处理该语句,将mutations_sync设为2,以等待所有副本。
如果开发过程中还有其他什么问题,或者想了解一些clickhouse的原理的程序员小哥哥,推荐朱凯老师这本书,希望它能帮到你们,目前市场上就这一本书,要珍惜啊。
链接地址点:ClickHouse原理解析与应用实践
查看更多关于Clickhouse文章,也可以进入这Clickhouse