ClickHouse进阶(七):Clickhouse数据查询-1

news2024/11/16 11:51:09

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!

 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频


目录

​​​​​​​1. with子句

1.1 定义变量

1.2 调用函数

1.3 定义子查询

1.4 在子查询中重复使用with

2. From子句

​​​​​​​3. Sample子句

3.1 Sample factor

3.2 Sample rows

3.3 SAMPLE factor OFFSET n

​​​​​​​4. Array Join子句


可以从官网下载官网提供的数据集hits_v1和visits_v1,对应的下载路径为:https://datasets.clickhouse.com/hits/partitions/hits_v1.tar和https://datasets.clickhouse.com/visits/partitions/visits_v1.tar,下载之后对应两个压缩包:

hits_v1.tar

visits_v1.tar

将以上两个压缩包进行上传到node1节点/softwar目录下,并解压到目录”/var/lib/clickhouse”中。

[root@node1 ~]# cd /software/

[root@node1 software]# tar xvf hits_v1.tar -C /var/lib/clickhouse

[root@node1 software]# tar xvf visits_v1.tar -C /var/lib/clickhouse

重启node1节点上的clickhouse,查询数据:

[root@node1 ~]# service clickhouse-server restart

[root@node1 ~]# clickhouse-client

node1 :) show databases;

┌─name─────┐

│ datasets │

│ default  │

│ system   │

└──────────┘



#查询表 hits_v1中的数据量

node1 :) select count(*) from datasets.hits_v1;

┌─count()─┐

│ 8873898 │

└─────────┘



#查询表 visits_v1中的数据量

node1 :) select count(*) from datasets.visits_v1;

┌─count()─┐

│ 1676861 │

└─────────┘

clickhouse完全使用SQL作为查询语言,能够以Selete查询语句从数据库中查询数据,虽然clickhouse拥有优秀的查询性能,但是我们也不能滥用查询,掌握clickhouse支持的各种查询子句很有必要,使用不恰当的SQL语句进行查询不仅带来低性能,还可能带来系统不可预知的错误。例如:我们使用select * 查询数据时,通配符*对列式存储的clickhouse没有一点好处,针对一张拥有133个列的数据表hits_v1,查询2000行数据时,使用*与不使用*速度相差几乎300倍:

#使用*查询2000行数据

node1 :) select * from datasets.hits_v1 limit 2000;

2000 rows in set. Elapsed: 4.306 sec. Processed 2.00 thousand rows, 2.23 MB (464.50 rows/s., 518.76 KB/s.)



#不使用*查询2000行数据

node1 :) select WatchID from datasets.hits_v1 limit 2000;

2000 rows in set. Elapsed: 0.016 sec. Processed 2.00 thousand rows, 16.00 KB (126.48 thousand rows/s., 1.01 MB/s.)

此外需要注意,clickhouse中对字段的解析大小写敏感,select a与select A表示的语义不同,下面我们学习下clickhouse中支持的查询语句。

​​​​​​​​​​​​​​1. with子句

clickhouse支持with子句以增强语句的表达,例如如下查询:

node1 :) SELECT pow(pow(2,2),3)

┌─pow(pow(2, 2), 3)─┐

│                64 │

└───────────────────┘

我们可以通过使用with子句进行简化,提高可读性:

node1 :) WITH pow(2,2) AS a SELECT power(a,3)

┌─pow(a, 3)─┐

│        64 │

└───────────┘

with的使用支持如下四种用法:

1.1 定义变量

可以通过with定义变量,这些变量在后续的查询子句中可以直接访问。例如:

node1 :) WITH 10 AS start

SELECT number

FROM system.numbers

WHERE number > start

LIMIT 5

┌─number─┐

│     11 │

│     12 │

│     13 │

│     14 │

│     15 │

└────────┘

1.2 调用函数

可以访问select子句中的列字段,并调用函数做进一步处理,处理之后的数据可以在select子句中继续使用。例如:

node1 :) WITH SUM(data_uncompressed_bytes) AS bytes

SELECT

    database,

    formatReadableSize(bytes) AS format

FROM system.columns

GROUP BY database

ORDER BY bytes DESC



┌─database─┬─format─────┐

│ datasets │ 7.40 GiB   │

│ system   │ 197.27 MiB │

│ default  │ 0.00 B     │

└──────────┴────────────┘

1.3 定义子查询

可以使用with定义子查询,例如,借助子查询可以得出各database未压缩数据大小与数据总和大小的比例排名:

node1 :) WITH (

        SELECT SUM(data_uncompressed_bytes)

        FROM system.columns

    ) AS total_bytes

SELECT

    database,

    (SUM(data_uncompressed_bytes) / total_bytes) * 100 AS database_disk_usage

FROM system.columns

GROUP BY database

ORDER BY database_disk_usage DESC



┌─database─┬─database_disk_usage─┐

│ datasets │   97.31767735000648 │

│ system   │   2.682322649993527 │

│ default  │                   0 │

└──────────┴─────────────────────┘

注意:在with中使用子查询时智能返回一行数据,如果结果集大于一行则报错。

1.4 在子查询中重复使用with

在子查询中可以嵌套使用With子句,例如,在计算出各database未压缩数据大小与数据总和的比例之后,又进行取整函数操作:

node1 :) WITH round(database_disk_usage) AS database_disk_usage_v1

SELECT

    database,

    database_disk_usage,

    database_disk_usage_v1

FROM

(

    WITH (

            SELECT SUM(data_uncompressed_bytes)

            FROM system.columns

        ) AS total_bytes

    SELECT

        database,

        (SUM(data_uncompressed_bytes) / total_bytes) * 100 AS database_disk_usage

    FROM system.columns

    GROUP BY database

    ORDER BY database_disk_usage DESC

)



┌─database─┬─database_disk_usage─┬─database_disk_usage_v1─┐

│ datasets │    97.2911778785499 │                     97 │

│ system   │  2.7088221214500954 │                      3 │

│ default  │                   0 │                      0 │

└──────────┴─────────────────────┴────────────────────────┘

2. From子句

From子句表示从何处读取数据,支持2种形式,由于From比较简单,这里不再举例,2种使用方式如下:

SELECT clo1 FROM tbl;
SELECT rst FROM (SELECT sum(col1) as rst FROM tbl)

from 关键字可以省略,此时会从虚拟表中取数,clickhouse中没有dual虚拟表,它的虚拟表是system.one,例如,以下两种查询等价:

SELECT 1;

SELECT 1 FROM system.one;

另外,FROM 子句后还可以跟上final修饰符,可以配合COllapsingMergeTree和VersionedCollapsingMergeTree等表引擎进行查询操作,强制在查询过程中合并,由于Final修饰符会降低查询性能,所以尽量避免使用Final修饰符。

​​​​​​​3. Sample子句

Sample子句可以实现数据采样功能,使查询仅返回采样数据而非全部数据,从而减少查询负载。Sample采样机制是幂等机制,也就是说在数据不发生变化,使用相同的采样规则总是能够返回相同的数据。

sample子句只能用于MergeTree系列表引擎,并且要求在Create Table时声明sample by 抽样表达式。

例如,创建表 tbl 声明sample by抽样表达式:

CREATE TABLE tbl(

id UInt32,

name String,

age UInt32,

birthday DATE

)ENGINE = MERGETREE()

PARTITION BY toYYYYMM(birthday)

ORDER BY (id,intHash32(age))

SAMPLE BY intHash32(age)

以上创建sample by 采样表时注意:

  1. Sample by 所声明的表达式必须同时包含在主键的声明内。
  2. Sample Key 必须是Int类型,虽然在建表不报错,但是数据查询时报错。

另外,建表时没有声明Sample by,在使用sample 采样时会报错。

Sample目前支持三种语法,前面导入的datasets.hits_v1创建时指定了SAMPLE BY ,建表语句如下:

CREATE TABLE datasets.hits_v1(

    `WatchID` UInt64,

    `JavaEnable` UInt8,

    `Title` String,

  ... ...

)

ENGINE = MergeTree()

PARTITION BY toYYYYMM(EventDate)

ORDER BY (CounterID, EventDate, intHash32(UserID))

SAMPLE BY intHash32(UserID)

下面就以表hits_v1为例,来讲解sample三种用法。

3.1 Sample factor

Sample factor表示按因子系数采样,factor表示采样因子,取值0-1之间的小数,表示采样总体数据的比例。如果factor 设置为0或者1,则表示不采样。使用如下:

#按10%的因子采样数据
SELECT CounterID FROM datasets.hits_v1 SAMPLE 0.1;
839889 rows in set. Elapsed: 0.114 sec. Processed 7.36 million rows, 88.30 MB (64.46 million rows/s., 773.46 MB/s.)

3.2 Sample rows

Sample rows表示按照样本数量采样,其中rows表示大概采样多少行数据,是个近似值,取值必须大于1,如果rows行数大于表总数,效果等同于rows=1,即不采样。使用如下:

node1 :) SELECT count() FROM datasets.hits_v1 SAMPLE 10000;

┌─count()─┐

│    9251 │

└─────────┘

3.3 SAMPLE factor OFFSET n

SAMPLE factor OFFSET n 表示按因子系数和偏移量采样,其中factor表示采样因子,即采样总数据的百分比,n表示偏移多少数据后才开始采样,它们两个取值都是0~1之间的小数。使用如下:

#偏移量0.5并按0.4的系数采样

node1 :) SELECT CounterID FROM datasets.hits_v1 SAMPLE 0.4 OFFSET 0.5;

3589194 rows in set.

偏移量0.5并按0.4的系数采样的采样为:从数据的二分之一处开始,按总数量的0.4采样数据。如果Sample比例采样出现了溢出,则数据会被自动截断,例如:

node1 :) SELECT CounterID FROM datasets.hits_v1 SAMPLE 0.4 OFFSET 0.9;

892694 rows in set.

​​​​​​​4. Array Join子句

Array join 子句允许在数据表的内部,与数组类型的字段进行join操作,从而将一行数组展开为多行。

首先我们创建一张 MergeTree引擎表并加入数据,操作如下:

#创建表 mr_tbl

node1 :) CREATE TABLE mr_tbl

(

    `id` UInt8,

    `name` String,

    `age` Int,

    `local` Array(String)

)

ENGINE = MergeTree()

ORDER BY id

#向表mr_tbl中插入数据

node1 :) insert into table mr_tbl values (1,'zs',18,['beijing','shanghai']),(2,'ls',19,['guangzhou','hangzhou']),(3,'ww',20,[]);



┌─id─┬─name─┬─age─┬─local────────────────────┐

│  1 │ zs   │  18 │ ['beijing','shanghai']   │

│  2 │ ls   │  19 │ ['guangzhou','hangzhou'] │

│  3 │ ww   │  20 │ []                       │

└────┴──────┴─────┴──────────────────────────┘

我们可以使用array join针对以上表数组字段一条膨胀成多条数据,类似Hive中的explode函数,在clickhouse中没有explode函数,可以使用array join 达到同样效果。

在使用Array join时,一条select语句中只能存在一个Array join(使用嵌套子查询除外),目前支持INNER和LEFT两种JOIN策略:

  • INNER ARRAY JOIN

Array join 默认使用的就是INNER JOIN 策略,使用如下:

node1 :) SELECT id,name,age,local FROM mr_tbl ARRAY JOIN local;

┌─id─┬─name─┬─age─┬─local─────┐

│  1 │ zs   │  18 │ beijing   │

│  1 │ zs   │  18 │ shanghai  │

│  2 │ ls   │  19 │ guangzhou │

│  2 │ ls   │  19 │ hangzhou  │

└────┴──────┴─────┴───────────┘

从以上查询结果来看,数据由原来的一行根据local列变成多行,并且排除掉了空数组对应的行。在使用Array Join时,如果我们在膨胀之后的数据结果中能够访问原有数组字段可以使用如下方式查询:

node1 :) SELECT id,name,age,local ,v FROM mr_tbl ARRAY JOIN local AS v;

┌─id─┬─name─┬─age─┬─local────────────────────┬─v─────────┐

│  1 │ zs   │  18 │ ['beijing','shanghai']   │ beijing   │

│  1 │ zs   │  18 │ ['beijing','shanghai']   │ shanghai  │

│  2 │ ls   │  19 │ ['guangzhou','hangzhou'] │ guangzhou │

│  2 │ ls   │  19 │ ['guangzhou','hangzhou'] │ hangzhou  │

└────┴──────┴─────┴──────────────────────────┴───────────┘
  • LEFT ARRAY JOIN

Array Join 子句支持LEFT连接策略,Left array join不会排除空数组,执行如下语句并查看结果。

node1 :) SELECT id,name,age,local FROM mr_tbl LEFT ARRAY JOIN local;

┌─id─┬─name─┬─age─┬─local─────┐

│  1 │ zs   │  18 │ beijing   │

│  1 │ zs   │  18 │ shanghai  │

│  2 │ ls   │  19 │ guangzhou │

│  2 │ ls   │  19 │ hangzhou  │

│  3 │ ww   │  20 │           │

└────┴──────┴─────┴───────────┘

当同时对多个数组字段进行Array join 操作时,array join 对应的多个字段的数组长度必须相等,查询的计算逻辑是按行合并并不是产生笛卡尔积,举例如下:

#创建表 mr_tbl2

node1 :) CREATE TABLE mr_tbl2

(

    `id` UInt8,

    `name` String,

    `age` Int,

`local` Array(String),

`score` Array(UInt32)

)

ENGINE = MergeTree()

ORDER BY id



#向表mr_tbl2中插入以下数据

node1 :) insert into table mr_tbl2 values (1,'zs',18,['beijing','shanghai'],[100,200]),(2,'ls',19,['guangzhou','hangzhou'],[300,400]),(3,'ww',20,[],[]);



┌─id─┬─name─┬─age─┬─local────────────────────┬─score─────┐

│  1 │ zs   │  18 │ ['beijing','shanghai']   │ [100,200] │

│  2 │ ls   │  19 │ ['guangzhou','hangzhou'] │ [300,400] │

│  3 │ ww   │  20 │ []                       │ [] │

└────┴──────┴─────┴──────────────────────────┴───────────┘



#执行array join 语句,将数组中的数据一变多行

node1 :) select id,name,age,local,local2,score,score2 from mr_tbl2 left array join local as local2 ,score as score2;


👨‍💻如需博文中的资料请私信博主。


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

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

相关文章

RK3568-i2c-适配8010rtc时钟芯片

硬件连接 从硬件原理图中可以看出&#xff0c;rtc时钟芯片挂载在i2c3总线上&#xff0c;设备地址需要查看芯片数据手册。编写设备树 &i2c3 {status "okay";rx8010: rx801032 {compatible "epson,rx8010";reg <0x32>;}; };使能驱动 /kernel/…

NPM 常用命令(三)

目录 1、npm compltion 1.1 描述 2、npm config 2.1 常用命令 2.2 描述 set get list delete edit fix 2.3 配置 json global editor location long 3、npm dedupe 3.1 描述 3.2 配置 4、npm deprecate 4.1 命令使用 4.2 描述 4.3 配置 registry ot…

【huggingface】数据集及模型下载并保存至本地

目录 数据集ChnSentiCorppeoples_daily_ner 模型bert-base-chinesehfl/rbt3t5-baseopus-mt-zh-enChinese_Chat_T5_Base 环境&#xff1a;没有代理&#xff0c;无法访问部分国外网络 数据集 正常情况下通过load_dataset加载数据集&#xff1b;save_to_disk保存至本地&#xff1b…

佳作导读 | 《C++ Core Guidelines》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 佳作导读 | 《C Core Guidelines》 《C Core Guidelines》由Bjarne Stroustrup和Herb Sutter等共同编写关于使用C编程语言的指南&#xff1b;旨在提供关于如何使用C进…

Linux常用命令——csplit命令

在线Linux命令查询工具 csplit 将一个大文件分割成小的碎片文件 补充说明 csplit命令用于将一个大文件分割成小的碎片&#xff0c;并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”&#xff0c;“xx01”。csplit命令是split的一个变体&#xff0c;split只…

如何在Win10系统上安装WSL(适用于 Linux 的 Windows 子系统)

诸神缄默不语-个人CSDN博文目录 本文介绍的方法不是唯一的安装方案&#xff0c;但在我的系统上可用。 文章目录 1. 视频版2. 文字版和代码3. 本文撰写过程中使用到的其他网络参考资料 1. 视频版 B站版&#xff1a;在Windows上安装Linux (WSL, 适用于 Linux 的 Windows 子系统…

【Rust 日报】2023-09-03 sudo-rs:sudo 和 su 的内存安全实现

sudo-rs&#xff1a;sudo 和 su 的内存安全实现 sudo-rs 项目通过以下方式改进了原始 sudo 的安全性&#xff1a; 使用内存安全语言&#xff08;Rust&#xff09;&#xff0c;因为估计原始 sudo 中三分之一的安全漏洞都与内存管理问题有关。省略不常用的功能&#xff0c;以减少…

记2个library cache lock故障case

第一个case 客户说晚上10点的时候做业务很卡&#xff0c;遂取对应时段awr 非常明显的library cache lock事件。这个事件是元数据锁&#xff0c;一旦泛滥对数据库的影响范围很大。 因此&#xff0c;他的泛滥第一时间应该想到会有大量持有元数据的动作。对sql进行检查 这个自动…

精益制造、质量管控,盛虹百世慧共同启动MOM(制造运营管理)

百世慧科技依托在电池智能制造行业中的丰富经验&#xff0c;与盛虹动能达成合作&#xff0c;为其提供MOM制造运营管理平台&#xff0c;并以此为起点&#xff0c;全面提升盛虹动能的制造管理水平与运营体系。 行业困境 中国动力电池已然发展为全球最大的电池产业&#xff0c;但…

【网络安全带你练爬虫-100练】第20练:数据处理-并写入到指定文档位置

目录 一、目标1&#xff1a;解码去标签 二、目标2&#xff1a;提取标签内内容 三、目标3&#xff1a;处理后的数据插入原位置 四、目标4&#xff1a;将指定的内容插入指定的位置 五、目标5&#xff1a;设置上下文字体格式 六、目标6&#xff1a;向多个不同位置插入不同的…

算法笔记:平衡二叉树

1 介绍 平衡二叉树&#xff08;AVL树&#xff09;是一种特殊的二叉搜索树&#xff08;BST&#xff09;&#xff0c;它自动确保树保持低高度&#xff0c;以便实现各种基本操作&#xff08;如添加、删除和查找&#xff09;的高效性能。 ——>时间都维持在了O(logN)它是一棵空…

网络安全—0基础入门学习手册

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

windows下配置pcl-python

1.前提概要 python版本的pcl基本上只有3.6的能用&#xff0c;本人3.7/3.8均进行了尝试。 因为很多博主提到的Gtk已经下载不了了&#xff0c;实在是维护人员太懒了。如果你看到这里&#xff0c;可以试试下面这个链接&#xff0c;说不定又能用了呢。 Gtk下载&#xff1a;http:…

vmware网卡(网络适配器)桥接、NAT、仅主机3种模式解析

Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09; Windows系统安装好vmware后&#xff0c;在网络连接中会生成VMnet1和VMnet8两个虚拟网卡。 VMnet1作用于仅主机模式&#xff0c;VMnet8作…

Java作业3

1.下面代码的运行结果是&#xff08;C&#xff09; public static void main(String[] args){String s;System.out.println("s"s);}A.代码编程成功&#xff0c;并输出”s” B.代码编译成功&#xff0c;并输出”snull” C.由于String s没有初始化&#xff0c;代码不…

Mqtt学习笔记--接入阿里云(2)

概述 在阿里云IoT平台中&#xff0c;MQTT协议是一种重要的连接方式&#xff0c;可以用于设备与平台之间的通信。通过配置设备的Topic和订阅规则&#xff0c;设备可以在平台上发布/订阅消息&#xff0c;实现设备状态的监控、控制和数据的传输。同时&#xff0c;阿里云IoT平台还提…

算法笔记 二叉搜索树

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种数据结构&#xff0c;用于存储具有可比较键&#xff08;通常是数字或字符串&#xff09;的元素 1 结构特点 节点结构&#xff1a;每个节点都有一个键和两个子节点&#xff08;左子节点和右子…

JavaWeb | 常用的HTML(JavaWeb)标签

目录&#xff1a; HTML简介HTML的基本结构HTML的常用标签&#xff1a;“标题” 标签“换行” 标签“段落” 标签“水平线” 标签“文字” 标签“粗体” 标签“下划线” 标签“斜体” 标签“上标” 标签“下标” 标签“闪烁” 标签表示 “空格”“列表” 标签&#xff1a;无序列…

VGA OUT 的PCB设计注意事项

VGA(Video Graphics Array)即视频图形阵列&#xff0c;具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口&#xff0c;同样也是LcD液晶显示设备的标准接口&#xff0c;具有广泛的应用范围。 VGA OUT PCB设计注意事项&#xff1a; 1、整体布局时&…

PCIe 配置空间:Command 寄存器

在 type 0 header 中,command 寄存器的位置如下图所示: 在 type 1 header 中,command 寄存器的位置如下图所示: Command 寄存器的结构如下图: 对于 PCIe,只有 Bit 0/1/2/6/8/10 是有效的,其他必须配置为 0 。 IO Space Enable 该位用于控制设别如何响应 I/O 空间的访…