大数据-143 - ClickHouse 集群 SQL 超详细实践记录!
点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:
[*]Hadoop(已更完)
[*]HDFS(已更完)
[*]MapReduce(已更完)
[*]Hive(已更完)
[*]Flume(已更完)
[*]Sqoop(已更完)
[*]Zookeeper(已更完)
[*]HBase(已更完)
[*]Redis (已更完)
[*]Kafka(已更完)
[*]Spark(已更完)
[*]Flink(已更完)
[*]ClickHouse(正在更新···)
章节内容
上节我们完成了如下的内容:
[*]副本和分片
[*]Distributed 部分
[*]编码实际案例测试
https://i-blog.csdnimg.cn/direct/b3fdb58ff80e4625b6b40d675c20586a.png
基本介绍
ClickHouse 是一种用于 OLAP(在线分析处理)的列式数据库,因其高速数据处理能力在大数据分析中备受青睐。ClickHouse 的 SQL 语法与标准 SQL 类似,但由于其专注于分析场景,有一些特殊的扩展。ClickHouse 默认不支持直接 DELETE 或 UPDATE 操作,但可以通太过区管理和合并机制间接清理数据。ClickHouse 提供了很多专门为高效分析而计划的功能。ClickHouse 提供了丰富的聚合函数,如 sum()、avg()、min()、max()、count()。
基本 SQL 语法
ClickHouse 的 SQL 语法与标准 SQL 类似,但由于其专注于分析场景,有一些特殊的扩展。
创建表的时候:
CREATE TABLE table_name (
column1 DataType,
column2 DataType,
...
) ENGINE = MergeTree()
ORDER BY (primary_key_columns);
[*]ENGINE:表引擎,最常用的是 MergeTree 系列。
[*]ORDER BY:必须指定排序键,支持对大数据集高效查询。
[*]PARTITION BY:按列举行分区(可选)。
[*]SAMPLE BY:用于大数据量下的采样查询(可选)。
删除或清理表数据的时候:
ClickHouse 默认不支持直接 DELETE 或 UPDATE 操作,但可以通太过区管理和合并机制间接清理数据。
ALTER TABLE table_name DROP PARTITION partition_expr;
特殊功能
聚合函数
ClickHouse 提供了丰富的聚合函数,如 sum()、avg()、min()、max()、count()。此外,另有以下特殊聚合函数:
SELECT uniqExact(column) FROM table_name; -- 精确去重计数
SELECT quantiles(0.5, 0.9)(column) FROM table_name; -- 分位数计算
窗口函数
ClickHouse 支持窗口函数,但语法略有不同。常见窗口函数有 row_number()、rank() 等:
SELECT column, rowNumber() OVER (PARTITION BY partition_column ORDER BY sort_column)
FROM table_name;
数组和嵌套范例
ClickHouse 支持数组和嵌套范例,适合处理复杂的数据布局:
SELECT arrayJoin(array) FROM table_name;
[*]arrayJoin:将数组睁开为多行
MergeTree 引擎
MergeTree 是 ClickHouse 最常用的引擎之一,具备排序、索引和分区的特性,可以或许高效处理海量数据。
[*]ORDER BY:界说主键,数据按照该字段排序。
[*]PRIMARY KEY:可以和 ORDER BY 一致,用于快速定位。
[*]PARTITION BY:用于数据按逻辑分片,淘汰查询范围。
[*]TTL:设置数据过期时间,主动清理汗青数据。
基本状态
目前我是ClickHouse的集群环境:
[*]h121.wzk.icu
[*]h122.wzk.icu
[*]h123.wzk.icu
建立连接
我们随机找一台建立链接
clickhouse-client -m --host h121.wzk.icu --port 9001 --user default --password clickhouse@wzk.icu
新建库
CREATE DATABASE mydatabase;
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/e28134384db84d1d941e2d59e75a4dc8.png
可以看到对应的路径如下所示:
cd /var/lib/clickhouse/data
ls
执行效果如下图,可以看到我们刚才创建的数据库:
https://i-blog.csdnimg.cn/direct/e4d91383df3a4e84a51403d727781a53.png
查看数据库
SHOW DATABASES;
运行效果如下图:
https://i-blog.csdnimg.cn/direct/895d8db4605c494ea316dffc973b74f9.png
新建表
# 方式1
CREATE TABLE my_table(
title String,
url String,
eventTime DateTime
) ENGINE = Memory;
# 方式2
CREATE TABLE mydatabase.my_table(
title String,
url String,
eventTime DateTime
) ENGINE = Memory;
# 方式3
CREATE TABLE mydatabase.my_table_2(
title String,
url String,
eventTime DateTime
) ENGINE = Memory AS SELECT * FROM mydatabase.my_table;
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/216b30b4fbe949cfb0955d092bb2d52a.png
查表布局
DESC my_table;
执行效果如下图:
https://i-blog.csdnimg.cn/direct/e934b0d0df404c84a10fe97bc209f95a.png
插入数据
INSERT INTO my_table VALUES ('wzk', '123', now());
执行的效果如下所示:
https://i-blog.csdnimg.cn/direct/fe4ac24e72334f5fa93e7f6ed0123634.png
暂时表
CREATE TABLE tmp_v1 (
title String,
create_time DateTime
) ENGINE = Memory;
如果暂时表与正常表名字相同,暂时表优先。
暂时表的引擎只能是Memory,数据是暂时的,断点数据就没了。
更多的是在ClickHouse内部,是数据在集群间传播度的载体。
分区表
创建新表
CREATE TABLE partition_v1 (
`id` String,
`url` String,
`eventTime` Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(eventTime)
ORDER BY id;
执行效果如下所示:
https://i-blog.csdnimg.cn/direct/de2796700ff8499395c3ed6a40c136eb.png
只有合并树(MergeTree)家属的表引擎支持分区表,可以使用分区表,做定位查询,缩小查询范围。分区字段不易设置的太小。
插入数据
INSERT INTO partition_v1 (id, url, eventTime) VALUES
('1', 'http://example.com/page1', '2024-01-01'),
('2', 'http://example.com/page2', '2024-01-15'),
('3', 'http://example.com/page3', '2024-02-01'),
('4', 'http://example.com/page4', '2024-02-15'),
('5', 'http://example.com/page5', '2024-03-01'),
('6', 'http://example.com/page6', '2024-03-15');
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/668a81c3387547cb81637f84599c0a72.png
查询数据
SELECT * FROM partition_v1;
执行效果如下所示:
https://i-blog.csdnimg.cn/direct/d55704722f15410a8fb55d39da5e594f.png
查看分区
SELECT table, partition, path FROM system.parts WHERE table = 'partition_v1';
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/a81bc226c0f14ed18e7000792ed5be27.png
视图表
[*]平凡视图:不生存数据,只是一层单纯的SELECT查询映射,起着简化查询的作用
[*]物化视图:生存数据,源表被写入数据,物化视图也会同步更新
[*]POPULATE修饰符:决定在创建物化视图的过程中是否将源表的数据同步到物化视图。
表基本操作
只有 MergeTree、Merge、Distribution这三类表引擎支持ALTER操作!!!
追加字段
ALTER TABLE partition_v1 ADD COLUMN os String default 'mac';
ALTER TABLE partition_v1 ADD COLUMN ip String after id;
DESC partition_v1;
执行效果如下:
https://i-blog.csdnimg.cn/direct/302ef02701834ef3b6860268ec971490.png
修改范例
注意:范例需要相互兼容
ALTER TABLE partition_v1 modify column ip IPv4;
DESC partition_v1;
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/41eedf902a8e4dc0bdf8617755e120d4.png
修改备注
ALTER TABLE partition_v1 COMMENT COLUMN id '主键ID';
DESC partition_v1;
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/45ce9fa8f4764a0dacd6218ba9325fd1.png
删除字段
ALTER TABLE partition_v1 DROP COLUMN url;
DESC partition_v1;
注意,删除字段会把该字段下的数据一起删除:
https://i-blog.csdnimg.cn/direct/844498422de244068f6a04d2d2013da6.png
移动表
rename TABLE default.partition_v1 to mydatabase.partition_v1;
USE mydatabase;
SHOW TABLES;
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/0563bb69ae004f009b75397cdfd46809.png
分区操作
查看分区
SELECT partition_id, name, table, database FROM system.parts where table = 'partition_v1';
执行效果如下所示:
https://i-blog.csdnimg.cn/direct/c80e6a1b13d545848b9aa0b134d4d75f.png
删除分区
ALTER TABLE partition_v1 DROP PARTITION 202401;
SELECT partition_id, name, table, database FROM system.parts where table = 'partition_v1';
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/28ea4376fbe84b78bf8e23b1d71cf7db.png
复制分区
ALTER TABLE partition_v2 replace partition 202402 FROM partition_v1;
重置分区
ALTER TABLE partition_v1 CLEAR COLUMN ip in partition202402;
[*]将 ip 列的值清空(设置为默认值)。
[*]清空操作不会删除记录,而是将指定列的值设置为默认值(如 0 或 NULL,详细取决于列的默认设置)。
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/b3f74907c1a5410b88a76f3b6d385344.png
卸载分区
ALTER TABLE partition_v1 DETACH partition 202402;
SELECT partition_id, name, table, database FROM system.parts where table = 'partition_v1';
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/458fa4d2653448d9bef511254c2a83c4.png
转载分区
ALTER TABLE partition_v1 ATTACH partition 202402;
SELECT partition_id, name, table, database FROM system.parts where table = 'partition_v1';
执行效果如下图所示:
https://i-blog.csdnimg.cn/direct/1b3988c7460e43c8b99b74746196ac61.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]