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

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.xdnf.cn/news/1483619.html

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

相关文章

设计分享—国外网站设计赏析

今天还是给大家分享一些国外的网站设计案例&#xff5e; 蓝蓝设计是一家专注而深入的界面设计公司&#xff0c;为期望卓越的国内外企业提供卓越的大数据可视化界面设计、B端界面设计、桌面端界面设计、APP界面设计、图标定制、用户体验设计、交互设计、UI咨询、高端网站设计、平…

安装caffe-CPU版本并进行训练

目录 前言 0、安装Ubuntu 18.04 版本 输入ls没有反应 ubuntu换源 换源出现的问题 1、安装caffe出现E:Unable to locate package caffe-cpu问题 2、把 code 文件夹下载到 ubuntu 3、在本地使用caffe-CPU&#xff0c;并部署数据标注工具 ATool 问题1 问题2 问题3 命令行…

AI智能名片S2B2C商城小程序在社群去中心化管理中的应用与价值深度探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;社群经济作为一种新兴的商业模式&#xff0c;正逐渐成为企业与用户之间建立深度连接、促进商业增长的重要途径。本文深入探讨了AI智能名片S2B2C商城小程序在社群去中心化管理中的应用&#xff0c;通过详细分析社群去中心化…

最新开源的解析效果非常好的PDF解析工具MinerU (pdf2md pdf2json)

毫不夸张的说 PDF解析工具MinerU是照进RAG黑暗中的一道光——这是我对它的评价。我测过太多了文档解析工具&#xff01; 最近在做文档解析的工作。看了很多的开源的文档解析的工具&#xff0c;版面分析的工具&#xff0c;其中包括paddelpaddel这样30kstar的明星工具。但是效果都…

STM32全栈嵌入式人脸识别考勤系统:融合OpenCV、Qt和SQLite的解决方案

1. 项目概述 本项目旨在设计并实现一个基于STM32的全栈人脸识别考勤系统。该系统结合了嵌入式开发、计算机视觉和数据库技术&#xff0c;实现了自动人脸检测、识别和考勤记录功能。 主要特点: 使用STM32F4系列微控制器作为主控制器采用OpenCV进行人脸检测和识别Qt开发跨平台…

将达梦数据库的JDBC驱动包 DmJdbcDriver18.jar 安装到本地 Maven 仓库

项目打包报错&#xff1a;Failure to find com.dameng:DmJdbcDriver18:jar:8.1.3.12 in http://maven.aliyun.com/nexus/content/groups/public 解决方式如下&#xff1a; 从 https://eco.dameng.com/download/ 中下载 达梦JDBC 驱动包&#xff0c;如下 JDK 1.8 对应的 JDBC…

GPT LangChain experimental agent - allow dangerous code

题意&#xff1a;GPT LangChain 实验性代理 - 允许危险代码 问题背景&#xff1a; Im creating a chatbot in VS Code where it will receive csv file through a prompt on Streamlit interface. However from the moment that file is loaded, it is showing a message with…

大语言模型在病理AI领域中的应用2|文献速递·24-07-18

小罗碎碎念 本期文献主题&#xff1a;大语言模型在病理AI领域中的应用 本期推文是大模型4病理AI系列的第2期&#xff0c;每一篇文献都使用了ChatGpt&#xff0c;应用场景如下&#xff1a; 直接用ChatGpt生成回答比较多种主流大模型在指定任务中的性能表现比较大模型与专用模型…

【Linux】Linux环境设置环境变量操作步骤

Linux环境设置环境变量操作步骤 在一些开发过程中本地调试经常需要依赖环境变量的参数&#xff0c;但是怎么设置对小白来说有点困难&#xff0c;今天就介绍下具体的操作步骤&#xff0c;跟着实战去学习&#xff0c;更好的检验自己的技术水平&#xff0c;做技术还是那句话&…

【python】OpenCV—Scanner

文章目录 1、需求描述2、代码实现3、涉及到的库函数cv2.arcLengthcv2.approxPolyDPskimage.filters.threshold_localimutils.grab_contours 4、完整代码5、参考 1、需求描述 输入图片 扫描得到如下的结果 用OpenCV构建文档扫描仪只需三个简单步骤: 1.边缘检测 2.使用图像中…

HarmonyOS NEXT零基础入门到实战-第一部分

构建节页面思路&#xff1a; 1、排版 (分析布局) 2、内容&#xff08;基础组件&#xff09; 3、美化&#xff08;属性方法&#xff09; 设计资源-svg图标 界面中展示图标 ->可以使用svg图标&#xff08;任意放大缩小不失真&#xff0c;可以改颜色&#xff09; 使用方式&a…

Floyd 算法 求最短路

推荐阅读&#xff1a;最短路 - OI Wiki 练习题目&#xff1a;力扣 - 1334 简介&#xff1a; 初始化&#xff1a;我们先把题目给的&#xff0c;两点直接相连的边的加入初始存在连接中。更新&#xff1a;然后每次只加入一个点对已有合法连接进行“拓展”更多的连接。结果&#…

【python】OpenCV—Coordinates Sorted Clockwise

文章目录 1、需求介绍2、算法实现3、完整代码 1、需求介绍 调用 opencv 库&#xff0c;绘制轮廓的矩形边框&#xff0c;坐标顺序为右下→左下→左上→右上&#xff0c;我们实现一下转化为熟悉的 左上→右上→右下→左下 形式 按照这样的顺序组织边界框坐标是执行透视转换或匹…

数学基础【俗说矩阵】:矩阵相乘

矩阵乘法 矩阵乘法推导过程 一、两个线性方程复合代入 二、X1和X2合并同类项 三、复合后方程组结果 四、线性方程组矩阵表示 五、线性方程组矩阵映射表示 复合映射表示 六、矩阵乘法导出 矩阵乘法法则 1、规则一推导过程 左取行&#xff0c;右取列&#xff0c;对应相乘后…

第122天:内网安全-域信息收集应用网络凭据CS 插件AdfindBloodHound

目录 前置知识 背景和思路 判断是否在域内 案例一&#xff1a;架构信息类收集-网络&用户&域控等 案例二&#xff1a;自动化工具探针-插件&Adfind&BloodHound Adfind(域信息收集工具) ​BloodHound&#xff08;自动化域渗透工具&#xff09; 前置知识 本…

初阶数据结构的实现1 顺序表和链表

顺序表和链表 1.线性表1.1顺序表1.1.1静态顺序表&#xff08;不去实现&#xff09;1.1.2动态顺序表1.1.2.1 定义程序目标1.1.2.2 设计程序1.1.2.3编写代码1.1.2.3测试和调试代码 1.1.2 顺序表的问题与思考 1.2链表1.2.1链表的概念及结构1.2.1.1 定义程序目标1.2.1.2 设计程序1.…

专题四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

<数据集>木材缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;4000张 标注数量(xml文件个数)&#xff1a;4000 标注数量(txt文件个数)&#xff1a;4000 标注类别数&#xff1a;8 标注类别名称&#xff1a;[Quartzity,Live_Knot,Marrow,resin,Dead_Knot,knot_with_crack,Knot_m…

彻底解决idea的编解码问题

一、打开idea&#xff0c;找到Setting,点击File Encoding编解码设置&#xff0c;将以下标红的三个部分全部设置为UTF-8.同理如果你的项目使用的是GBK或者其他编码格式&#xff0c;那么也设置为统一。 二、点击Java Compiler设置补齐-encoding utf-8参数 三、如果你的项目使用到…

HiFi-GAN——基于 GAN 的声码器,能在单 GPU 上生成 22 KHz 音频

拟议的 HiFiGAN 可从中间表征生成原始波形 源码地址&#xff1a;https://github.com/NVIDIA/DeepLearningExamples 论文地址&#xff1a;https://arxiv.org/pdf/2010.05646.pdf 研究要点包括 **挑战&#xff1a;**基于 GAN 的语音波形生成方法在质量上不及自回归模型和基于流…