ClickHouse(十八)数据有限更新

1.概述

使用clickhouse的聚合函数,可以实现数据的有限更新,从而减少使用optimize table带来的性能开销。

2.测试数据表

CREATE TABLE temp.user_profile_list on cluster ck_cluster
(
    `uid` Int64 COMMENT '用户唯一标识',
    `reg_time` DateTime COMMENT '注册时间',
    `nickname` String COMMENT '昵称',
    `phone` String COMMENT '手机号码',
    `part` Int64
)
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/temp/tables/{shard}/user_profile_list', '{replica}')
partition by part
order by uid
SETTINGS index_granularity = 8192;

CREATE TABLE temp.user_profile_list_all on cluster ck_cluster
as temp.user_profile_list
ENGINE = Distributed('ck_cluster', 'temp', 'user_profile_list', intHash64(uid));

insert into temp.user_profile_list_all(uid, reg_time, nickname, phone, part)
select 123, now(), '小明', '123', 1;

insert into temp.user_profile_list_all(uid, reg_time, nickname, phone, part)
select 123, now(), '小明', '1234', 2;

insert into temp.user_profile_list_all(uid, reg_time, nickname, phone, part)
select 124, now(), '小明', '1234', 2;

在这里插入图片描述

3.使用聚合函数

CREATE TABLE temp.user_profile_test on cluster ck_cluster
(
    `uid` Int64 COMMENT '用户唯一标识',
    `reg_time` AggregateFunction(argMaxIf, DateTime, DateTime, UInt8) COMMENT '注册时间',
    `nickname` AggregateFunction(argMaxIf, String, DateTime, UInt8) COMMENT '昵称',
    `phone` AggregateFunction(argMaxIf, String, DateTime, UInt8) COMMENT '手机号码'
)
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/temp/tables/{shard}/user_profile_test', '{replica}')
ORDER BY uid
SETTINGS index_granularity = 8192;

CREATE TABLE temp.user_profile_test_all on cluster ck_cluster
as temp.user_profile_test
ENGINE = Distributed('ck_cluster', 'temp', 'user_profile_test', intHash64(uid));

从测试表写入数据:
写入也要用聚合函数来实现,选取最大版本保留,数据写入和顺序没有关系,If函数可以用来判断空值然后不写入,写入即可查询,不用optimize table操作。

insert into temp.user_profile_test_all(uid, nickname, reg_time, phone)
SELECT
    uid,
    argMaxIfState(nickname, reg_time, nickname!='') nickname,
    argMaxIfState(reg_time, reg_time, 1=1) reg,
    argMaxIfState(phone,reg_time,phone!='') phone
FROM temp.user_profile_list_all
group by uid;

4.查询结果

select uid,argMaxIfMerge(nickname),
       argMaxIfMerge(reg_time),
       argMaxIfMerge(phone)
       from temp.user_profile_test_all
group by uid;

uid=123,数据已经更新为最新版本的了
在这里插入图片描述

Clickhouse中,更新数据的方式主要有两种:MUTATION操作和使用特定的MergeTree引擎。 首先,MUTATION操作是通过ALTER TABLE语句来实现数据更新和删除。然而,MUTATION操作是一种较重的操作,与标准的SQL语法中的UPDATE和DELETE不同,它是异步执行的。因此,MUTATION操作更适用于批量数据不频繁更新或删除的场景。你可以参考中提供的链接了解更多关于MUTATION操作的信息。 其次,Clickhouse通过使用CollapsingMergeTree、VersionedCollapsingMergeTree和ReplacingMergeTree等特定的MergeTree引擎,来实现数据更新和删除。 CollapsingMergeTree、VersionedCollapsingMergeTree和ReplacingMergeTree都是通过INSERT语句插入最新的数据,新数据会“抵消”或“替换”掉老数据。但是,这些操作都是在数据文件后台Merge时发生的,也就是说,在Merge之前,新数据和老数据会同时存在。因此,在查询时需要注意避免查询到老数据。 使用CollapsingMergeTree和VersionedCollapsingMergeTree需要标记位字段和版本字段,而使用ReplacingMergeTree则更加方便。你可以参考中提供的Clickhouse官方文档链接了解如何使用CollapsingMergeTree和VersionedCollapsingMergeTree。 综上所述,你可以根据具体业务需求选择合适的方式来实现Clickhouse中的数据更新和删除操作。请参考和提供的链接获取更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Clickhouse如何实现数据更新](https://blog.csdn.net/shuyun123456789/article/details/122726982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [ClickHouse 数据插入、更新与删除操作 SQL](https://blog.csdn.net/m0_67401055/article/details/126098952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高并发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值