大数据ClickHouse进阶(九):ClickHouse的From和Sample子句

举报
Lansonli 发表于 2022/09/25 05:16:26 2022/09/25
【摘要】 文章目录 ClickHouse的From和Sample子句 一、From子句 二、​​​​​​​Sample子句 ClickHouse的From和Sample子句 一、From子句 From子句表示从何处读取数据,支持2种形式,由于From比较简单,这里不再举例,2种使用方式如下: SELECT clo1 FRO...

文章目录

ClickHouse的From和Sample子句

一、From子句

二、​​​​​​​Sample子句


ClickHouse的From和Sample子句

一、From子句

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


  
  1. SELECT clo1 FROM tbl;
  2. SELECT rst FROM (SELECT sum(col1) as rst FROM tbl)

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


  
  1. SELECT 1;
  2. SELECT 1 FROM system.one;

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

二、​​​​​​​Sample子句

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

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

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


  
  1. CREATE TABLE tbl(
  2. id UInt32,
  3. name String,
  4. age UInt32,
  5. birthday DATE
  6. )ENGINE = MERGETREE()
  7. PARTITION BY toYYYYMM(birthday)
  8. ORDER BY (id,intHash32(age))
  9. SAMPLE BY intHash32(age)

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

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

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

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


  
  1. CREATE TABLE datasets.hits_v1(
  2. `WatchID` UInt64,
  3. `JavaEnable` UInt8,
  4. `Title` String,
  5. ... ...
  6. )
  7. ENGINE = MergeTree()
  8. PARTITION BY toYYYYMM(EventDate)
  9. ORDER BY (CounterID, EventDate, intHash32(UserID))
  10. SAMPLE BY intHash32(UserID)

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

  • Sample factor

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


  
  1. #按10%的因子采样数据
  2. SELECT CounterID FROM datasets.hits_v1 SAMPLE 0.1;
  3. 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.)
  • Sample rows

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


  
  1. node1 :) SELECT count() FROM datasets.hits_v1 SAMPLE 10000;
  2. ┌─count()─┐
  3. │ 9251 │
  4. └─────────┘
  • SAMPLE factor OFFSET n

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


  
  1. #偏移量0.5并按0.4的系数采样
  2. node1 :) SELECT CounterID FROM datasets.hits_v1 SAMPLE 0.4 OFFSET 0.5;
  3. 3589194 rows in set.

 

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


  
  1. node1 :) SELECT CounterID FROM datasets.hits_v1 SAMPLE 0.4 OFFSET 0.9;
  2. 892694 rows in set.

 


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

文章来源: lansonli.blog.csdn.net,作者:Lansonli,版权归原作者所有,如需转载,请联系作者。

原文链接:lansonli.blog.csdn.net/article/details/126913483

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。