clickhouse如何删除数据

原创 2020-11-27 18:09 阅读(8984)次

clickhouse删除数据提供了三种方式:

一、是删除分区,数据就会删除掉
二、是通过Alter语句删除数据
三、是还可以通过设置日期字段或表的TTL生命周期,到期自动清除数据

注意:上面前2点都可以使用分布式DDL删除集群各节点数据,第三点是创建表时定义的,暂时不提。

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何时能删除数据,如果要做到强一致性,需要应用反查确认。

例如可以定时反查确认数据是否被删除:

        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数据生命周期

没有用过,这里只提一下


如果开发过程中还有其他什么问题,或者想了解一些clickhouse的原理的程序员小哥哥,推荐朱凯老师这本书,希望它能帮到你们,目前市场上就这一本书,要珍惜啊。

链接地址点:ClickHouse原理解析与应用实践