ClickHouse 入门(二)【基础SQL操作】

news2024/9/21 21:49:16

1、ClickHouse 

1.1、SQL 操作

这里只介绍一些和我们之前 MySQL 不同的语法;

1.1.1、Update 和 Delete

        ClickHouse 提供了 Delete 和 Update 的能力,这类操作被称为 Mutation 查询(可变查询),它可以看 做 Alter 的一种。

         虽然可以实现修改和删除,但是和一般的 OLTP 数据库不一样,Mutation 语句是一种很 “重”的操作,而且不支持事务

         “重”的原因主要是每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区。 所以尽量做批量的变更,不要进行频繁小数据的操作。

        由于操作比较“重”,所以 Mutation 语句分两步执行,同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上的失效标记。直到触发分区合并的时候,才会删除旧数据释放磁盘空间,一般不会开放这样的功能给用户,由管理员完成。

1)删除操作

语法:

alter table order_info_5 delete where id = '101';

查看数据目录:

2)修改操作
alter table table_name update total_amount = toDecimal32(2000.0,2) where id = '102';

再次查看数据目录:

        可以看到,刚刚删除数据之后目录已经被自动合并,但是现在我们更新操作之后,它并不是在原本的数据之上直接更新,而是把更新后数据写入到一个新的目录!所以我们说它是一个重量级的操作;

优化思路

        正因为删除和更新操作太过重量级,会发生大量的磁盘 IO,所以我们可以给它加一个标记字段:

  • _isDelete:如果为 0 代表删除,如果为 1 代表可以被访问。
  • _version:更新操作都改用插入完成,只是对版本+1

这样我们只需要在使用的时候加个过滤即可

1.1.2、多维分析

ck 的查询和标准 SQL 差别不大:

  • 支持子查询
  • 支持 CTE(with ... as 语法)
  • 支持 join,但是不建议使用
  • 窗口函数

多维分析指的就是从多个维度进行分析,不同的聚合逻辑的粒度是不同的,所以分析结果也是不同的,比如学生总成绩:

  • 如果 group by 学校,就可以得到每个学校每个班级的总成绩
  • 如果 group by 学生,得到的就是各个学校总成绩

多维分析,从 SQL 中体现就是这样:

select xxx from xxx group by a,b
union all
select xxx from xxx group by a
union all
select xxx from xxx group by b
union all
select xxx from xxx

        当维度非常多的时候,n 个维度有 2^n 个组合,我们不可能自己手写出来,所以 ck 在 group by 语句后面提供了 with rollup\with cube\with tota;

        同样,Hive 其实也提供了多维分析的语法(grouping sets(xxx...)):

 

同样,毕竟当维度很多的时候,这种语法依然费手,所以 Hive 同样提供了 cubes 和 rollups 语法:

 下面我们插入测试数据演示一下:

1、with rollup 上卷

上卷指的是必须从最大粒度开始 group by,要有先后顺序:

select xxx from xxx
select xxx from xxx group by a
select xxx from xxx group by a,b

查询结果:

        可以看到,它的查询结果是从细粒度到粗粒度,这样做的好处是粗粒度计算结果可以直接从细粒度中聚合得到,就不需要重新大量计算了!这也是一种优化; 

:空字段会用默认值代替,这里的 id 是 UInt 所以默认是 0,这里的 sku_id 是字符串默认是空串; 

2、with cube 多维分析

也就是所有的组合情况它都得有:

select xxx from xxx group by a,b
select xxx from xxx group by a
select xxx from xxx group by b
select xxx from xxx

 查询结果:

3、with totals 总计

总计指的是维度要么都有,和都没有这两种情况

select xxx from xxx group by a,b
select xxx from xxx

查询结果:

 

1.1.3、alter 操作

上面我们已经使用过 alter table 进行删除和更新数据了;

新增字段

得益于 ck 是面向列的数据库,所以新增字段对它性能的影响并不大; 

alter table table_name add column new_col String after age
修改字段类型
alter table table_name modify column column_name String
删除字段
alter table table_name drop column col_name

1.1.4、导出数据

clickhouse-client --query "select * from t_order_mt where create_time='2020-06-01 12:00:00'" --format CSVWithNames > /opt/module/data/rs1.csv

这个用得不多;

1.2、副本引擎

        副本的目的主要是保障数据的高可用性;

1.2.1、副本写入流程

        在 ck 集群中并没有 master/slave 之分,当客户端向任意 ck 节点写入时,该 ck 节点都会向 zookeeper 提交写入日志,这是 zk 的 watch 机制就会通知到 ck 集群中的其他节点,这些节点就会去该节点去下载同步数据;

1.2.2、配置副本

在 hadoop102 的/etc/clickhouse-server/config.d 目录下创建一个名为 zk.xml(任意名) 的配置文件,内容如下:

<?xml version="1.0"?> 
<yandex> 
 <zookeeper-servers> 
 <node index="1"> 
 <host>hadoop102</host> 
 <port>2181</port> 
 </node> 
 <node index="2"> 
 <host>hadoop103</host> 
 <port>2181</port> 
 </node> 
 <node index="3"> 
 <host>hadoop104</host> 
 <port>2181</port> 
 </node> 
 </zookeeper-servers> 
</yandex> 

完了记得把这个文件的所有者和所在组设为 clickhouse:clickhouse:

chown -R clickhouse:clickhouse ./zk.xml

然后在 config.xml 中添加(指定外部文件): 

<zookeeper incl="zookeeper-servers" optional="true" /> <include_from>/etc/clickhouse-server/config.d/zk.xml</include_from>

完了之后,分发配置文件 config.xml 和 zk.xml,启动 zk 集群,然后重启 ck 集群;

要使用副本,必须使用副本表,官网中也说了,只有 MergeTree 支持副本表!

下面我们创建一张具有两个副本的表(hadoop102 和 hadoop103):

注意副本只能同步数据,不能同步表结构,所以表需要自己创建!

在 hadoop102 创建副本表:

注:这里的 01 是分片名称,这里是默认写法; 

在 hadoop103 创建:

创建成功后,我们可以在 zookeeper 中看到节点的信息(可以看出,ck 还是比较依赖 zookeeper 的):

此时,我们向 hadoop103 写入数据:

按照上面的同步原理,hadoop102 应该是可以查到的:

1.3、分片集群

        副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量 数据,对数据的横向扩容没有解决。

        要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切 分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用。

        Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间件, 通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据。

注意:ClickHouse 的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分片,避免降低查询性能以及操作集群的复杂性。

1.3.1、集群写入流程(3分片2副本)

这里有个 internal_replication 的参数,它决定了是否内部同步:

  • 当它为 true 的时候,客户端写入的数据,首先会同步到第一个切片副本,然后这个副本会自动同步一份给另一个副本;然后以此类推,最终客户端只需要写入 3 次(和分片数一致);
  • 当这个参数为 false 的时候,6 个副本都将由客户端来写入。这样会使客户端压力很大;

1.3.2、集群读取流程(3 分片 2 副本)

1.3.3、副本配置(2 分片 3 副本) 

这里我们配置 2 个分片,3 个副本:

hadoop102分片1分片1副本1
hadoop103分片1分片1副本2
hadoop104分片2分片2副本1
<yandex> 
 <remote_servers> 
 <gmall_cluster> <!-- 集群名称--> 
 <shard> <!--集群的第一个分片--> 
 <internal_replication>true</internal_replication> 
 <!--该分片的第一个副本--> 
 <replica> 
 <host>hadoop102</host> 
 <port>9000</port> 
 </replica> 
 <!--该分片的第二个副本--> 
 <replica> 
 <host>hadoop103</host> 
 <port>9000</port> 
 </replica> 
 </shard> 
 
 <shard> <!--集群的第二个分片--> 
 <internal_replication>true</internal_replication> 
 <replica> <!--该分片的第一个副本--> 
 <host>hadoop104</host> 
 <port>9000</port> 
 </shard> 
 
 </gmall_cluster> 
 </remote_servers> 
<zookeeper-servers> 
 <node index="1"> 
 <host>hadoop102</host> 
 <port>2181</port> 
 </node> 
 <node index="2"> 
 <host>hadoop103</host> 
 <port>2181</port> 
 </node> 
 <node index="3"> 
 <host>hadoop104</host> 
 <port>2181</port> 
 </node> 
 </zookeeper-servers> 
 
 <macros> 
 <shard>01</shard> <!--不同机器放的分片数不一样--> 
 <replica>rep_1_1</replica> <!--不同机器放的副本数不一样--> 
 </macros>
</yandex>

        这里最后的标签<macros> 是 "宏" 的意思,其中的子标签 <shard> 和 <replica> 是我们自定义的,为的是将来建表时能够从配置文件直接读取;每个节点的宏是不一样的,需要根据我们的分片副本规则来调整(同一个分片的相同副本不能存储在一个节点,不然会报错);上面是 hadoop102 的配置,剩余的节点的宏配置如下(别的配置都一样):

hadoop103: 

 <macros> 
 <shard>01</shard> <!--分片1--> 
 <replica>rep_1_2</replica> <!--分片1的第2个副本--> 
 </macros>

hadoop104

 <macros> 
 <shard>02</shard> <!--分片1--> 
 <replica>rep_2_1</replica> <!--分片1的第2个副本--> 
 </macros>

完了重启三台节点的 clickhouse 服务,可以 show clusters; 命令查看是否已经识别配置中的集群名称;

创建表

如果希望使用分片副本就需要再建表语句的表名后面加上 ON CLUSTER 集群名称

hadoop102 创建完成后,其余两台节点都会自动完成创建;

创建分布式表

       上面的表中存储的只是自己分片所负责存储的信息,虽然现在表中还没有存储数据(不能直接往里插入数据,那么分片就无效了,而是应该往分布式表插入,在分布式表中定义分片的规则):

 参数名称:Distributed(集群名称,库名,本地表名,分片键)

注意:这里的本地表名指的是本地的分片表表名!

上面我们创建了一张分布式表,我们根据 sku_id 来进行分片; 下面我们向分布式表中插入数据:

查询分布式表(全量数据)

首先,我们查询分布式表:

分布式表中存储的是全量的数据,这也是我们为什么要创建它的原因;

查询分片表(分片数据)

 

可以看到,我们的数据根据 sku_id 被分到不同的分片中了; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1934678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产化低功耗HDMI转VGA方案,大量出货产品,广泛应用在显示器以及广告机产品

芯片描述&#xff1a; 兼具高性能和低成本效益的优点&#xff0c;是一款可以将高清视频 HDMI1.4 数字信号转换成 VGA 模拟信号输出的芯片。不需要提供外部电源&#xff0c;ICNM7301 就可以在正常模式下使用&#xff1b;ICNM7301 广 泛适用于各种市场系统和显示应用体系&#x…

2024-07-18 Unity插件 Odin Inspector8 —— Type Specific Attributes

文章目录 1 说明2 特定类型特性2.1 AssetList2.2 AssetSelector2.3 ChildGameObjectsOnly2.4 ColorPalette2.5 DisplayAsString2.6 EnumPaging2.7 EnumToggleButtons2.8 FilePath2.9 FolderPath2.10 HideInInlineEditors2.11 HideInTables2.12 HideMonoScript2.13 HideReferenc…

【 FPGA 线下免费体验馆】高端 AMD- xilinx 16 nm UltraScale +系列

在复杂的FPGA 开发的过程中&#xff0c;需要能够满足高速、高精度、多通道等的复杂应用。而一个简单的 FPGA 开发板是不具备这些的&#xff0c;因此需要用更高端&#xff0c;大容量&#xff0c;高速IO的 FPGA 芯片与其他硬件组成一个完整的系统开发。这里就产生了高端 FPGA 开发…

拍视频麦克风什么牌子好,什么麦克风音质好,无线麦克风品牌推荐

​当我们想要记录生活中的精彩瞬间&#xff0c;或是在工作中展现专业的一面时&#xff0c;声音的质量显得尤为重要。想象一下&#xff0c;在一间教室中&#xff0c;老师使用无线领夹麦克风&#xff0c;让每一个知识点都能准确无误地传达给学生&#xff1b;在一场激烈的体育赛事…

基于springboot新生宿舍管理系统

系统背景 在当今高等教育日益普及的时代背景下&#xff0c;高校作为知识传播与创新的重要基地&#xff0c;其基础设施的智能化管理显得尤为重要。新生宿舍作为大学生活的起点&#xff0c;不仅是学生日常生活与学习的重要场所&#xff0c;也是培养学生独立生活能力和团队合作精神…

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…

Kotlin泛型实化

内联函数 reified实现 1. 内联函数 内联函数中的代码会在编译的时候自动被替换到调用它的地方&#xff0c;这样的话也就不存在什么泛型擦除的问题了&#xff0c;因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明。 2. reified关键字 在Kotlin中&#xff0…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素&#xff1a;网络抖动、网络延时、音视频同步 网络抖动&#xff1a;视频帧在网络上传输&#xff0c;会受到网络抖动的影响&#xff0c;不能收到立刻播放&#xff0c;需要进行适当的平滑 网络延时&#xff1a;一些报文在…

Axure 教程 | 设置文本框背景透明

​在AXURE软件中&#xff0c;部件样式可以编辑&#xff0c;但有时却无法满足所有个性化原型的需求。例如文本框部件&#xff0c;可以设置是否隐藏边框&#xff0c;但即使隐藏边框之后&#xff0c;文本框还会有白色的背景。 当界面需要一个无背景色的输入框时&#xff0c;对于完…

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

QtC++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法&#xff0c;并不是一个固定使用的搭配&#xff0c;就算是普通switch语句&#xff0c;Map&#xff0c;乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多&#xff0c;主要是其的侧…

FastAPI -- 第三弹(自定义响应、中间件、代理、WebSockets)

路径操作的高级配置 OpenAPI 的 operationId from fastapi import FastAPIapp FastAPI()# 通过 operation_id 参数设置 app.get("/items/", operation_id"some_specific_id_you_define") async def read_items():return [{"item_id": "F…

基于Llama Index构建RAG应用

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本文参与活动是2024 DataWhale AI夏令营&#xff1b;&#x1f632; 在本文中作者将通过&#xff1a; Gradio、Streamlit和LlamaIndex介绍 LlamaIndex 构…

与VR融合的LED显示屏

随着技术的飞速发展&#xff0c;广告行业已经迎来了3.0时代&#xff0c;这标志着户外LED显示屏不再仅仅局限于空间展示&#xff0c;而是转向了一个全新的维度——“空间时间人”的场景化营销。这种转变要求LED显示屏行业不仅要增强显示技术&#xff0c;还要将消费者的个性化特征…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.1计算机软硬件与2.1.2计算机网络

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

Spring框架之DI依赖注入

Di(Dependence Injection)依赖注入,在spring框架负责创建bean对象时,动态地将依赖对象注入到其它对象中 一、什么是依赖注入。 我们在下面构建spring的过程中体会依赖注入&#xff1b; 从上面的图中我们知道&#xff0c;在ssm框架中服务层&#xff08;server&#xff09;无法直…

【操作系统】文件管理——文件共享与保护,文件系统的结构(个人笔记)

学习日期&#xff1a;2024.7.18 内容摘要&#xff1a;文件共享&#xff0c;文件保护&#xff0c;文件系统的层级结构和全局结构&#xff0c;虚拟文件系统 文件共享 操作系统提供的文件共享功能&#xff0c;可以让多个用户共享使用同一个文件。文件共享和文件复制是不一样的&a…

DP(6) | 完全背包 | Java | LeetCode 322, 179, 139 做题总结

322. 零钱兑换 我的错误答案 class Solution {public int coinChange(int[] coins, int amount) {int[][]dp new int [coins.length][amount1];for(int j0; j<amount; j) {if(coins[0] j){dp[0][coins[0]] 1;}}for(int i1; i<coins.length; i) {for(int j0; j<am…

实战篇(十一) : 拥抱交互的三维世界:利用 Processing 和 OpenGL 实现炫彩粒子系统

🌌 拥抱交互的三维世界:利用 Processing 和 OpenGL 实现炫彩粒子系统 在现代计算机图形学中,三维粒子系统是一个激动人心的领域。它不仅可以用来模拟自然现象,如烟雾、火焰和水流,还可以用来创造出令人叹为观止的视觉效果。在这篇文章中,我们将深入探讨如何使用 Proces…

Dify中的高质量索引模式实现过程

思考在什么情况下会使用到高质量索引模式呢?第1种情况是在知识库中上传文档,文档被拆分为段落后需要进行编码(增加);第2种情况是在召回测试的时候,需要对query进行编码(查询);第3种情况是当文档中的段落增加和更新时需要进行编码(增加和更新)。索引模式是针对知识库…