[SQL系列]从零开始学Clickhouse

起因

        听说2024年开始金三银四了,所以我和我的小伙伴们也抱着再去拿一些Offer的准备。但是一上来就蒙了,对方问,听说你对数据库非常熟悉,那就说说ClickHouse吧。

        这怎么就不按套路出牌呢?不一般就问Mysql的InnoDB嘛。

        赶紧回来学起来,什么是ClickHouse?

什么是ClickHouse

        ClickHouse 是一个用于在线分析处理(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的Yandex公司开发,专门设计用于快速查询海量数据集。ClickHouse 的核心特点是高性能、可扩展性和实时数据分析能力。它具有以下几个特性:

  • 列式存储

        ClickHouse 使用列式存储,这意味着数据是按列而不是按行存储的。这种存储方式对于分析查询非常有利,因为它可以显著减少磁盘I/O和内存使用,同时提高数据压缩率。列式存储允许ClickHouse在执行查询时只读取相关的列,而不是整行数据,从而加快查询速度。

  • 高性能

        ClickHouse 被设计为尽可能快地处理查询。它支持并行和分布式处理,可以在多个服务器上分配查询负载。ClickHouse 还包括一系列优化的数据存储和处理算法,以及一个高度优化的查询执行引擎。

  • SQL支持

        ClickHouse 支持 SQL 作为查询语言,这使得熟悉 SQL 的用户可以轻松地使用它。ClickHouse 的 SQL 支持包括对标准查询、聚合、连接、窗口函数和其他高级分析功能的支持。

  • 可扩展性和可靠性

        ClickHouse 支持水平扩展,可以通过添加更多服务器来增加计算和存储能力。它还提供了数据复制和故障转移功能,确保系统的可靠性和数据的安全性。

ClickHouse能用来做什么

ClickHouse 适用于各种数据分析场景,包括:

        1. Web分析

        ClickHouse 可以用来存储和分析网站流量数据,包括页面浏览量、用户访问、点击率等。通过ClickHouse,可以快速查询特定时间段内的用户行为,从而优化网站设计和提高用户体验。

        2. 广告网络和实时竞价

        在广告网络中,ClickHouse 可以用来处理大量的广告展示和点击数据,支持实时竞价(RTB)系统。ClickHouse 的高性能查询允许广告平台快速做出决策,提高广告投放的效果。

        3. 用户行为分析

        ClickHouse 可以用来分析用户在移动应用或在线服务中的行为。例如,分析用户如何与不同功能互动,哪些功能最受欢迎,以及用户的留存率。

        4. 金融分析

        在金融服务中,ClickHouse 可以用来存储和分析交易数据、市场数据和历史价格。分析师可以使用ClickHouse来执行复杂的时间序列分析,预测市场趋势,或者进行风险评估。

        5. IoT数据分析

        ClickHouse 适用于存储和分析来自物联网设备的大量数据。例如,可以分析传感器数据来监测设备的性能,预测维护需求,或者优化能源消耗。

        6. 时序数据分析

        ClickHouse 支持高效的时间序列数据存储和分析。它可以用来监控服务器的性能指标,如CPU使用率、内存使用和磁盘I/O,以及分析这些指标随时间的变化。

        7. 大规模数据仓库

        ClickHouse 可以作为数据仓库使用,存储来自多个来源的大量数据。它支持数据复制和分布式查询,使得跨多个服务器分析数据变得简单高效。

        8. 快速报告和仪表板

        ClickHouse 可以与BI工具(如Grafana、Tableau等)集成,为业务分析师提供快速的数据报告和交互式仪表板。这使得非技术用户也能够轻松地从大量数据中提取洞察。

        9. 实时数据流处理

        ClickHouse 可以与流处理系统(如Kafka、RabbitMQ等)集成,支持实时数据流的分析。这使得ClickHouse能够处理连续的数据流,并支持近实时的决策制定。

        10. 自定义数据分析应用

        ClickHouse 的灵活性和性能使其成为开发自定义数据分析应用程序的理想选择。开发人员可以根据特定的业务需求构建高效的数据分析解决方案。

开始学习

安装学习环境

        最后的学习环境莫过于直接在Docker里面进行配置了,因此下面的内容主要是讲如何在Docker里面配置好ClickHouse的。

        

  1. 安装 Docker:确保你的系统上安装了 Docker。可以从 Docker 官网 下载并安装适合你操作系统的版本。(如何已经安装好了docker这一步可以跳过)

  2. 切换国内源:在Windows操作系统中,修改C:/Users/用户/.docker/config.json文件,在里面加上下面的源。

    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://mirror.ccs.tencentyun.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
      ]

    这一步懂得科学上网或者拉镜像的可以跳过。

  3. 拉取 ClickHouse 镜像:打开命令行工具,使用以下命令拉取最新的 ClickHouse 镜像。

    docker pull clickhouse/clickhouse-server
    
  4. 运行 ClickHouse 容器:拉取镜像后,可以使用以下命令来启动一个 ClickHouse 容器。

    docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
    

    这条命令会创建一个后台运行的 ClickHouse 容器。--ulimit nofile=262144:262144 是为了提高系统文件描述符的限制,以确保 ClickHouse 可以打开足够的文件。当然这里也可以自己添加其他参数配置,比如-p 8123:8123 将容器的 8123 端口映射到宿主机的 8123 端口,-v [本地路径]:/var/lib/clickhouse 将本地数据目录挂载到容器中。

  5. 连接到 ClickHouse:容器启动后,你可以使用 docker exec 命令进入容器并使用 clickhouse-client 命令行工具。

    docker exec -it some-clickhouse-server clickhouse-client
    

    这会打开一个交互式的 ClickHouse 客户端,你可以在这里执行 SQL 查询。

增删改查

这些步骤就是很普通的CRUD,命令和MYSQL比较相似,跟POSTGRESQL就相差比较大了。

1. 创建数据库

CREATE DATABASE example;

2. 使用数据库

USE example;

3. 创建表

CREATE TABLE example_table (
    id UInt32,
    name String,
    birthday Date
) ENGINE = MergeTree()
ORDER BY id;

这里使用 MergeTree 引擎,它是 ClickHouse 中最常用的存储引擎,适用于大多数场景。

4. 插入数据

INSERT INTO example_table (id, name, birthday) VALUES (1, 'Alice', '1990-01-01');
INSERT INTO example_table (id, name, birthday) VALUES (2, 'Bob', '1992-02-02');
INSERT INTO example_table (id, name, birthday) VALUES (3, 'Catherine', '1993-03-03');

这里得一条条执行,直接全部复制下去会执行失败的。 

5. 查询数据

SELECT * FROM example_table;

得到如下结果 

SELECT *
FROM example_table

Query id: dffeb873-14d6-4bf1-9972-218cf45ace3c

   ┌─id─┬─name──────┬───birthday─┐
1. │  3 │ Catherine │ 1993-03-03 │
   └────┴───────────┴────────────┘
   ┌─id─┬─name──┬───birthday─┐
2. │  1 │ Alice │ 1990-01-01 │
   └────┴───────┴────────────┘
   ┌─id─┬─name─┬───birthday─┐
3. │  2 │ Bob  │ 1992-02-02 │
   └────┴──────┴────────────┘

3 rows in set. Elapsed: 0.003 sec.

 

这将返回表中的所有数据和列。

6. 条件查询

SELECT * FROM example_table WHERE name = 'Alice';

得到如下结果 

Query id: cf45f273-e900-4235-a691-2eae99e79150

   ┌─id─┬─name──┬───birthday─┐
1. │  1 │ Alice │ 1990-01-01 │
   └────┴───────┴────────────┘

1 row in set. Elapsed: 0.003 sec.

 

7. 聚合查询

SELECT COUNT(*) FROM example_table;
SELECT COUNT(DISTINCT name) FROM example_table;

8. 分组查询

SELECT COUNT(*) FROM example_table GROUP BY birthday;
Query id: 16b44809-deb4-4715-8c4a-afbf3ddeceb0

   ┌─count()─┐
1. │       1 │
2. │       1 │
3. │       1 │
   └─────────┘

 

9. 更新数据

ClickHouse 不支持传统意义上的行级更新,但你可以通过 ALTER TABLE 语句更新数据。

ALTER TABLE example_table UPDATE name = 'Alice Smith' WHERE id = 1;

10. 删除数据

同样,ClickHouse 不支持传统意义上的行级删除,但你可以通过 ALTER TABLE 语句删除数据。

ALTER TABLE example_table DELETE WHERE id = 1;
Query id: a3f7d6e8-75dc-4c41-85a9-d338d6b516bc

   ┌─id─┬─name──────┬───birthday─┐
1. │  3 │ Catherine │ 1993-03-03 │
   └────┴───────────┴────────────┘
   ┌─id─┬─name─┬───birthday─┐
2. │  2 │ Bob  │ 1992-02-02 │
   └────┴──────┴────────────┘

2 rows in set. Elapsed: 0.003 sec.

 

11. 使用索引

在创建表时,你可以指定索引列以优化查询性能。

CREATE TABLE indexed_table (
    id UInt32,
    name String,
    birthday Date,
    INDEX idx_name name TYPE minmax GRANULARITY 5
) ENGINE = MergeTree()
ORDER BY id;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea的插件,反编译整个jar包

idea的插件,反编译整个jar包 1.安装插件1.1找到插件1.2 搜索插件 2.反编译整个jar包2.1 复制jar包到工件目录下:2.2 选中jar包,点出右键 3.不用插件,手动查看某一个java类3.1 选中jar包,点出右键 1.安装插件 1.1找到插…

日本宇宙航空研究“Int-Ball2”自由飞行相机机器人采用的Epson IMU

IMU有助于飞行的稳定控制和电池充电的自动对接- 精工爱普生公司(TSE:6724,“Epson”)很高兴地宣布,日本宇宙航空研究开发机构(JAXA)选择了爱普生M-G370系列的惯性测量单元(IMU)&…

Spring Security介绍(三)过滤器(2)自定义

除了使用security自带的过滤器链,我们还可以自定义过滤器拦截器。 下面看下自定义的和security自带的执行顺序。 一、总结 1、自定义过滤器: 一般自定义fliter都是: import lombok.extern.slf4j.Slf4j; import org.springframework.ster…

0418EmpTomCat项目 初次使用ajax实现局部动态离职

0418EmpTomCat项目包-CSDN博客 数据库字段: 员工部门表 分页查询; 多条件查询; 添加新员工; ajax点击离职操作效果:

R-Tree: 原理及实现代码

文章目录 R-Tree: 原理及实现代码1. R-Tree 原理1.1 R-Tree 概述1.2 R-Tree 结构1.3 R-Tree 插入与查询 2. R-Tree 实现代码示例(Python)结语 R-Tree: 原理及实现代码 R-Tree 是一种用于管理多维空间数据的数据结构,常用于数据库系统和地理信…

使用FPGA发送一个经过曼彻斯特编码的伪随机序列

介绍 这几天突然就不知道要使用FPGA实现什么样的功能了,然后就跑去学习数电了,学的也是晕晕的。正好之前写了一个使用FPGA发送伪随机序列的代码,然后因为需要使用曼彻斯特编码,所以又加了一个模块吧,使得最后输出的波形经过曼彻斯特编码。 曼彻斯特编码 首先,曼彻斯特编…

Spark-机器学习(7)分类学习之决策树

在之前的文章中,我们学习了分类学习之支持向量机,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。…

C语言——栈的实现

栈(Stack)是一种基于先进后出(LIFO)原则的数据结构,类似于我们平常堆放书籍或者盘子的方式。 栈通常是从高地址向低地址增长的,也就是说,栈顶位于较高的内存地址,而栈底位于较低的内…

初始计算机网络

TCP/IP TCP/IP模型 TCP/IP网络模型:对于不同设备之间的通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。 TCP/IP分层 这个网络协议是分层的,每一层都有…

PyVista 3D数据可视化 Python 库 简介

Pyvista是一个用于科学可视化和分析的Python库 ;我认为它适合做一些网格数据的处理; 它封装了VTK(Visualization Toolkit)之上,提供了一些高级接口, 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

【Qt】控件的核心属性

1 🍑控件概述🍑 Widget 是 Qt 中的核⼼概念. 英⽂原义是 “⼩部件”, 我们此处也把它翻译为 “控件” .控件是构成⼀个图形化界⾯的基本要素。 Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件。这⼀点在 Qt Designer 中就可以看到端倪&#xf…

装饰器模式、代理模式、适配器模式对比

装饰器模式、代理模式和适配器模式都是结构型设计模式,它们的主要目标都是将将类或对象按某种布局组成更大的结构,使得程序结构更加清晰。这里将装饰器模式、代理模式和适配器模式进行比较,主要是因为三个设计模式的类图结构相似度较高、且功…

10分钟了解数据质量管理-奥斯汀格里芬 Apache Griffin

在不重视数据质量的大数据发展时期,Griffin并不能引起重视,但是随着数据治理在很多企业的全面开展与落地,数据质量的问题开始引起重视。 1.Griffin简介 Griffin是一个开源的大数据数据质量解决方案,由eBay开源,它支持…

httpClient提交报文中文乱码

httpClient提交中文乱码,ContentType类型application/json 指定提交参数的编码即可 StringEntity se new StringEntity(paramBody.toJSONString(),"UTF-8");se.setContentType("application/json");context.httpPost.setHeader("Cookie&…

【PPT设计】颜色对比、渐变填充、简化框线、放大镜效果、渐变形状配图、线条的使用

目录 图表颜色对比、渐变填充、简化框线放大镜效果渐变形状配图 线条的使用区分标题与说明信息区分标题与正文,区分不同含义的内容**聚焦****引导****注解****装饰** 图表 颜色对比、渐变填充、简化框线 小米汽车正式亮相!你们都在讨论价格,我全程只关…

【实时数仓架构】方法论(未完)

笔者不是专业的实时数仓架构,这是笔者从其他人经验和网上资料整理而来,仅供参考。写此文章意义,加深对实时数仓理解。 实时数仓背景和场景 一、实时数仓架构技术演进 1.1、四种架构演进 1)离线大数据架构 一种批处理离线数据分…

State.initState() must be a void method without an `async` keyword错误解析

文章目录 报错问题报错的代码 错误原因解决方法解析 另外的方法 报错问题 State.initState() must be a void method without an async keyword如下图: 报错的代码 报错的代码如下: overridevoid initState() async{super.initState();await getConf…

springboot权限验证学习-上

创建maven项目 创建父工程 这类项目和原来项目的区别在于&#xff0c;打包方式是pom 由于pom项目一般都是用来做父项目的&#xff0c;所以该项目的src文件夹可以删除掉。 创建子工程 子工程pom.xml 父工程pom.xml 添加依赖 父工程导入依赖包 <!--导入springboot 父工程…

李沐70_bert微调——自学笔记

微调BERT 1.BERT滴哦每一个词元返回抽取了上下文信息的特征向量 2.不同的任务使用不同的特性 句子分类 将cls对应的向量输入到全连接层分类 命名实体识别 1.识别应该词元是不是命名实体&#xff0c;例如人名、机构、位置 2.将非特殊词元放进全连接层分类 问题回答 1.给…

fetch请求后端返回文件流,并下载。

前端&#xff1a; <script src"~/layui/layui.js"></script> <script src"~/Content/js/common/js/vue.min.js"></script> <script src"~/Content/js/common/js/jquery-1.10.2.min.js"></script><styl…
最新文章