前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在clickhouse中更新和删除

在clickhouse中更新和删除

作者头像
用户1217611
发布2021-12-31 07:59:08
发布2021-12-31 07:59:08
3K00
代码可运行
举报
文章被收录于专栏:文渊之博文渊之博
运行总次数:0
代码可运行

ck 目前支持了更新和删除,但是与传统sql语法 略有不同,我也记录下来,防止后面忘记。

测试数据

代码语言:javascript
代码运行次数:0
运行
复制
:) select count(*) from system.columns where table='test_update';

┌─count()─┐
│     332 │
└─────────┘

:) select count(*) from test_update;

┌──count()─┐
│ 17925050 │
└──────────┘

具体删除&更新实现

语法 如下:

代码语言:javascript
代码运行次数:0
运行
复制
ALTER TABLE <table_name> DELETE WHERE <filter>;

and

代码语言:javascript
代码运行次数:0
运行
复制
ALTER TABLE <table_name> UPDATE col1 = expr1, ... WHERE <filter>;

示例

代码语言:javascript
代码运行次数:0
运行
复制
:) select event_status_key, count(*) from test_update where event_status_key in (0, 22) group by event_status_key;

┌─event_status_key─┬──count()─┐
│                0 │ 17824710 │
│               22 │     1701 │
└──────────────────┴──────────┘
代码语言:javascript
代码运行次数:0
运行
复制
假设event_status_key= 22的数据都是错误数据,我们需要修复这个问题
代码语言:javascript
代码运行次数:0
运行
复制
:) ALTER TABLE test_update UPDATE event_status_key=0 where event_status_key=22;

0 rows in set. Elapsed: 0.067 sec.

如上,反馈很及时,但是更新是异步的,可能需要等一会,看下结果:

代码语言:javascript
代码运行次数:0
运行
复制
:) select event_status_key, count(*) from test_update where event_status_key in (0, 22) group by event_status_key;

 ┌─event_status_key─┬──count()─┐
 │                0 │ 17826411 │
 └──────────────────┴──────────┘

返回结果正确,这个更新操作会被记录到system.mutations 表里面:

代码语言:javascript
代码运行次数:0
运行
复制
:) select * from system.mutations where table='test_update';

Row 1:
──────
database:                   test
table:                      test_update
mutation_id:                mutation_162.txt
command:                    UPDATE event_status_key = 0 WHERE event_status_key = 22
create_time:                2018-10-12 12:39:32
block_numbers.partition_id: ['']
block_numbers.number:       [162]
parts_to_do:                0
is_done:                    1

注意: 1. 该命令必须在版本号大于1.1.54388才可以使用,适用于 mergeTree 引擎 2. 该命令是异步执行的,可以通过查看表 system.mutations 来查看命令的是否执行完毕

可以使用system.parts 表查询一些意思的洞察数据:

代码语言:javascript
代码运行次数:0
运行
复制
:) select name, active, rows, bytes_on_disk, modification_time from system.parts where table='test_update' order by modification_time;

┌─name──────────────┬─active─┬────rows─┬─bytes_on_disk─┬───modification_time─┐
│ all_1_36_2        │      0 │ 3841126 │     637611245 │ 2018-10-12 12:16:24 │
│ all_37_75_2       │      0 │ 4358144 │     598548358 │ 2018-10-12 12:16:47 │
│ all_112_117_1     │      0 │  638976 │     167899233 │ 2018-10-12 12:17:00 │
│ all_151_155_1     │      0 │  778240 │      27388052 │ 2018-10-12 12:17:29 │
│ all_76_111_2      │      0 │ 3833856 │     989762502 │ 2018-10-12 12:17:30 │
│ all_156_161_1     │      0 │  837460 │      27490891 │ 2018-10-12 12:17:43 │
│ all_118_150_2     │      0 │ 3637248 │     859673147 │ 2018-10-12 12:17:52 │
│ all_1_36_2_162    │      1 │ 3841126 │     637611232 │ 2018-10-12 12:39:32 │
│ all_37_75_2_162   │      1 │ 4358144 │     598548352 │ 2018-10-12 12:39:32 │
│ all_76_111_2_162  │      1 │ 3833856 │     989762502 │ 2018-10-12 12:39:32 │
│ all_112_117_1_162 │      1 │  638976 │     167899233 │ 2018-10-12 12:39:32 │
│ all_118_150_2_162 │      1 │ 3637248 │     859673147 │ 2018-10-12 12:39:32 │
│ all_151_155_1_162 │      1 │  778240 │      27388052 │ 2018-10-12 12:39:32 │
│ all_156_161_1_162 │      1 │  837460 │      27490891 │ 2018-10-12 12:39:32 │
└───────────────────┴────────┴─────────┴───────────────┴─────────────────────┘

数据展示每个分区被更新的操作的时间,而且它的更新速度非常快

如果有数组列在我们表中如何处理。如何给所有用户增加 这个数组的value 的值

代码语言:javascript
代码运行次数:0
运行
复制
:) select count(*) from test_update where has(dmp_audience_ids, 31694239);

┌─count()─┐
│  228706 │
└─────────┘
代码语言:javascript
代码运行次数:0
运行
复制
使用arrayPushBack 函数给dmp_audience_ids 列加入值1234567:
代码语言:javascript
代码运行次数:0
运行
复制
:) alter table test_update update dmp_audience_ids = arrayPushBack(dmp_audience_ids, 1234567) where has(dmp_audience_ids, 31694239);
代码语言:javascript
代码运行次数:0
运行
复制
立即查询反馈结果
代码语言:javascript
代码运行次数:0
运行
复制
:) select count(*) from test_update where has(dmp_audience_ids, 1234567)

┌─count()─┐
│  228706 │
└─────────┘

:) select dmp_audience_ids from test_update where has(dmp_audience_ids, 1234567) and length(dmp_audience_ids)<5 limit 1;

┌─dmp_audience_ids─────────────────────┐
│ [31694239,31694422,31694635,1234567] │
└──────────────────────────────────────┘

注意事项:

Clickhouse更新操作有一些限制:

  1. 索引列不能进行更新
  2. 分布式表不能进行更新
  3. ALTER TABLE UPDATE/DELETE不支持分布式DDL,因此需要在分布式环境中手动在每个节点上local的进行更新/删除数据。
  4. 不适合频繁更新或point更新由于Clickhouse更新操作非常耗资源,如果频繁的进行更新操作,可能会弄崩集群,请谨慎操作。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试数据
  • 具体删除&更新实现
    • Clickhouse更新操作有一些限制:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档