ClickHouse实现大数据探索性分析

news2024/12/28 18:27:31

分析数据一般会从探索性分析开始,即尝试理解数据本身的概况。通常包括中位数、平均值或分布情况,Python Numpy/Pandas很容易实现,但如果数据量为Tb级,不能简单依赖RAM工具实现。ClickHouse提供的强大的工具来挖掘数据,不仅局限于min/max/avg分析。

测试数据

下面在clickhouse中创建示例表,并生成测试数据:

CREATE TABLE test (
  `time` DateTime, `a` UInt64, `b` Float64,
  `c` UInt32, `d` UInt32, `e` UInt32
) 
ENGINE = MergeTree
ORDER BY time

新版ClickHouse可以不指定ENGINE,为了兼容之前版本,这里显示指定表引擎,下面生成10亿测试数据:

INSERT INTO test
SELECT now() - number, rand64()/1000000000,
       round(rand32()/1000000)/100,
       rand32()/1000000, rand32()/10000, rand32()/100
FROM numbers(1000000000);

探索性分析

Min, Max, Avg, Median

首先通过基本的聚集函数实现:

SELECT min(a), max(a), avg(a), median(a) FROM test

可以a列的总体情况:

返回结果:


SELECT
    min(a),
    max(a),
    avg(a),
    median(a)
FROM test

Query id: ba893a8e-1c1e-4ae0-93d1-b966a370c841

┌─min(a)─┬──────max(a)─┬────────────avg(a)─┬────median(a)─┐
│     27 │ 18446744043 │ 9223167195.242725 │ 9269412176.5 │
└────────┴─────────────┴───────────────────┴──────────────┘

注意:median函数是近似实现(为了性能考虑),如果需要准确结果实用medianExact()。

对于相同类型列,可以实用ForEach合并器展示所有列的聚集结果:

WITH [a, c, d, e] AS col
SELECT maxForEach(col), minForEach(col),
       avgForEach(col), medianForEach(col)
FROM test

注意,这里跳过b列,因为b为Float类型,不是Int类型。结果返回多个数组值,顺序于with子句保持一致:

查看结果:


WITH [a, c, d, e] AS col
SELECT
    maxForEach(col),
    minForEach(col),
    avgForEach(col),
    medianForEach(col)
FROM test

Query id: e0da1a1d-0dd7-4ac1-8061-13e5b1d32637

┌─maxForEach(col)────────────────────┬─minForEach(col)─┬─avgForEach(col)────────────────────────────────────────────────────────┬─medianForEach(col)────────────────────┐
│ [18446744043,4294,429496,42949672] │ [27,0,0,0]      │ [9223167195.242725,2147.084726271,214757.971990777,21475846.697796952] │ [9094439831,2158,215857.5,21585783.5] │
└────────────────────────────────────┴─────────────────┴────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────┘

加权平均

有时需要计算加权平均,一列为业务度量(假设为a列)、一列为权重(这里假设为c列):

SELECT avgWeighted(a, c) FROM test

结果与标准平均有差异,因为c列表示每行的权重:


SELECT avgWeighted(a, c)
FROM test

Query id: b5af5a0f-2b15-4410-a4b9-2432673b43e1

┌─avgWeighted(a, c)─┐
│ 4500282.012782601 │
└───────────────────┘

分位数

数据值分布分析用于理解大多数样本值的分布情况,可以使用quantile函数,下面展示a列的值分布情况:

SELECT quantile(0.01)(a), quantile(0.05)(a), quantile(0.1)(a),
       quantile(0.5)(a),  quantile(0.9)(a),  quantile(0.95)(a),
       quantile(0.99)(a)
FROM test

结果如下:


SELECT
    quantile(0.01)(a),
    quantile(0.05)(a),
    quantile(0.1)(a),
    quantile(0.5)(a),
    quantile(0.9)(a),
    quantile(0.95)(a),
    quantile(0.99)(a)
FROM test

Query id: 3085d3ef-387a-4e01-a6b0-42ce33393839

┌─quantile(0.01)(a)─┬─quantile(0.05)(a)─┬─quantile(0.1)(a)─┬─quantile(0.5)(a)─┬───quantile(0.9)(a)─┬──quantile(0.95)(a)─┬─quantile(0.99)(a)─┐
│      177601178.51 │       896692543.5 │     1874314795.8 │       9045538672 │ 16552719369.300003 │ 17504816857.949997 │    18283462553.02 │
└───────────────────┴───────────────────┴──────────────────┴──────────────────┴────────────────────┴────────────────────┴───────────────────┘

quantile函数参数表示需要计算的百分位数,范围:0~1之间。

  • 0.01 表 1% 百分位 (表示:a列值中仅1%小于计算结果),
  • 0.99 表示 99% 百分位,
  • 0.5 表示 50% 百分位 (或中位数).

我们可以使用箱线图展示列数据的分布情况。通常用于展示数据分布及异常值。

直方图

histogram函数计算数据直方图,参数为分组数量:

SELECT histogram(10)(a) FROM test

结果如下:

Query id: 12671173-07b6-4626-88cf-1c1e0b06b311

┌─hist_a─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [(27,1778599749.8154733,96220818.875),(1778599749.8154733,3567318758.13501,96866341.75),(3567318758.13501,5383282603.941727,98348320.75),(5383282603.941727,7229037840.827569,100085775.125),(7229037840.827569,9098282038.82383,101508675.125),(9098282038.82383,10979523217.501022,102238136.25),(10979523217.501022,12860395774.905602,102171698.875),(12860395774.905602,14731643787.83552,101508574.5),(14731643787.83552,16590229016.271152,100691124.875),(16590229016.271152,18446744043,100360533.875)] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 21.144 sec. Processed 1.00 billion rows, 8.00 GB (47.29 million rows/s., 378.36 MB/s.)

返回10元组数组,每个tuple包括起始值、截止值和频数。上面结果不够直观,下面使用bar函数进行展示:

WITH    count(*) AS m, histogram(10)(a) AS h
SELECT  m, arrayJoin(h).3 AS v, bar(v, 0, m / 10, 50) hist
FROM    test

这里计算a列直方图,分为10个组,用频次作为高度:获取元组的第三个值:arrayJoin(h).3 。bar中几个参数意义分别为:当前值,最小值,最大值,最大宽度(bar的最大宽度),结果如下:


WITH
    count(*) AS m,
    histogram(10)(a) AS h
SELECT
    m,
    arrayJoin(h).3 AS v,
    bar(v, 0, m / 10, 50) AS hist
FROM test

Query id: 84d73ecf-4ad6-436a-b007-d4028a8703b5

┌──────────m─┬─────────────v─┬─hist───────────────────────────────────────────────┐
│ 1000000000 │      96191900 │ ████████████████████████████████████████████████   │
│ 1000000000 │   96848619.75 │ ████████████████████████████████████████████████▍  │
│ 1000000000 │  98342270.625 │ █████████████████████████████████████████████████▏ │
│ 1000000000 │   100073373.5 │ ██████████████████████████████████████████████████ │
│ 1000000000 │ 101491254.375 │ ██████████████████████████████████████████████████ │
│ 1000000000 │  102252583.25 │ ██████████████████████████████████████████████████ │
│ 1000000000 │ 102199888.125 │ ██████████████████████████████████████████████████ │
│ 1000000000 │  101529766.75 │ ██████████████████████████████████████████████████ │
│ 1000000000 │ 100703527.125 │ ██████████████████████████████████████████████████ │
│ 1000000000 │   100366816.5 │ ██████████████████████████████████████████████████ │
└────────────┴───────────────┴────────────────────────────────────────────────────┘

10 rows in set. Elapsed: 20.589 sec. Processed 1.00 billion rows, 8.00 GB (48.57 million rows/s., 388.56 MB/s.)

偏度(skewness)和峰度(kurtosis) 偏度

SELECT skewPop(a), skewPop(b), skewPop(c), skewPop(d) FROM test

可以看到完美的对称数据,如果偏度范围是 -0.5~0.5,则为对称。


SELECT
    skewPop(a),
    skewPop(b),
    skewPop(c),
    skewPop(d)
FROM test

Query id: 3d8f142e-540a-45cf-b29b-92ebcb680655

┌─────────────skewPop(a)─┬──────────────skewPop(b)─┬──────────────skewPop(c)─┬──────────────skewPop(d)─┐
│ 0.00008286246282390312 │ -0.00009044879302832024 │ -0.00009040144066574894 │ -0.00009043134876494848 │
└────────────────────────┴─────────────────────────┴─────────────────────────┴─────────────────────────┘

下面检查峰度情况,峰度包括正态分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3)。

SELECT kurtPop(a), kurtPop(b), kurtPop(c), kurtPop(d) FROM test

结果如下:


SELECT
    kurtPop(a),
    kurtPop(b),
    kurtPop(c),
    kurtPop(d)
FROM test

Query id: bfa86913-a7ec-46d2-b568-4337cd36c8f1

┌─────────kurtPop(a)─┬─────────kurtPop(b)─┬────────kurtPop(c)─┬─────────kurtPop(d)─┐
│ 1.7999958442027149 │ 1.8000103475159206 │ 1.800009989793573 │ 1.8000101052993867 │
└────────────────────┴────────────────────┴───────────────────┴────────────────────┘

唯一值

ClickHouse使用高效内存近似计算唯一值算法,通常用在探索性分析阶段:

SELECT uniq(a), uniq(b), uniq(c), uniq(d), uniq(e) FROM test

如果需要准确计算,采用count(distinct s) 。uniq采用HLL(HyperLogLog,默认精度为17),可以通过uniqCombined()指定精度,精度越高准确度越高,占用内存越大。


SELECT
    uniq(a),
    uniq(b),
    uniq(c),
    uniq(d),
    uniq(e)
FROM test

Query id: dff853d6-b2b6-4d60-8a7f-8769feb91a68

┌───uniq(a)─┬─uniq(b)─┬─uniq(c)─┬─uniq(d)─┬──uniq(e)─┐
│ 976951893 │    4296 │    4295 │  431282 │ 42794211 │
└───────────┴─────────┴─────────┴─────────┴──────────┘

最受欢迎值

计算数据集中最受欢迎值

SELECT a, count(*) AS total FROM test
GROUP BY a ORDER BY total DESC LIMIT 5

该语句等价于:

SELECT topK(5)(a) FROM test

结果如下:


SELECT topK(5)(a)
FROM test

Query id: a97a98fa-1ce5-42cf-a201-2094f6cd999f

┌─topK(5)(a)─────────────────────────────────────────────────┐
│ [5887434584,5400923505,14324499147,1971311740,12559436788] │
└────────────────────────────────────────────────────────────┘

topK比传统写法效率更高、更简洁,建议使用topK.

标准差

标准差可以理解数据的分散程度,varPop函数可以计算标准差:

SELECT varPop(a), varPop(c), varPop(d) FROM test

结果如下:

SELECT
    varPop(a),
    varPop(c),
    varPop(d)
FROM test

Query id: 47696a42-dd17-47fa-a937-00e49bc6d11b

┌────────────varPop(a)─┬─────────varPop(c)─┬─────────varPop(d)─┐
│ 28357107720360067000 │ 1537149.986743688 │ 15371500762.27394 │
└──────────────────────┴───────────────────┴───────────────────┘

计算公式:
在这里插入图片描述

相关性

计算两列的相关性:

SELECT covarPop(c,d) FROM test

返回结果:


SELECT covarPop(c, d)
FROM test

Query id: 0ac4a304-03e8-42ce-b521-dc23187c6aea

┌─────covarPop(c, d)─┐
│ 153714998.91794837 │
└────────────────────┘

计算公式:

在这里插入图片描述

实际应用中相关性系数更常用,它可以消除量纲,计算相关系数:

SELECT corr(c,d) FROM test

返回结果:


SELECT corr(c, d)
FROM test

Query id: 450eb864-f1f5-4945-9bf4-c88bcf9a75d5

┌─────────corr(c, d)─┐
│ 0.9999999725139772 │
└────────────────────┘

因为完美插入测试数据采用不同比例,两者当然为正相关,结果接近1.

总结

ClickHouse提供数学函数、聚集函数用于对大数据量进行探索性分析。一些函数采用近似算法进行优化,如:unique,quantile,效率更高,通常用于数据分析的初始阶段。下面列举探索性阶段常用的函数:

  • min(), max(), avg() and median() 最常用的几个聚集函数
  • avgWeighted(col, weights) 计算加权平均
  • quantile(level)(col) 计算分位数
  • histogram(bins)(col) and bar() 计算并画直方图
  • skewPop(col) 计算偏度,判断数据是否对称
  • uniq(col) 近似唯一值计算
  • topK(N)(col) 计算最受欢迎的N个值
  • varPop(col) 计算标准差

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

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

相关文章

7.基于概率距离快速削减法的风光场景生成与削减方法

matlab代码&#xff1a;基于概率距离快速削减法的风光场景生成与削减方法 参考代码资源&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&a…

【大数据基础】基于 TMDB 数据集的电影数据分析

https://dblab.xmu.edu.cn/blog/2400/ 实验内容 环境搭建 pip3 install bottle数据预处理 本次项目使用的数据集来自知名数据网站 Kaggle 的 tmdb-movie-metadata 电影数据集&#xff0c;该数据集包含大约 5000 部电影的相关数据。本次实验使用数据集中有关电影的数据表 tm…

五一临近,赋能乡村振兴,低代码也有话讲!

中国作为农业生产大国&#xff0c;农业已成为近千年来中国主要的经济来源&#xff0c;农民人口基数庞大。因此&#xff0c;乡村振兴战略的提出对推进农业农村现代化具有重要意义&#xff0c;治理好乡村成为解决“三农”问题的必要举措。 随着时代的发展&#xff0c;人们反而更向…

【STC8A8K64D4开发板】——有源蜂鸣器鸣响控制

学习目的 掌握有源蜂鸣器驱动电路的设计&#xff1a;控制方式、限流电阻的计算和确定。了解有源蜂鸣器的特性以及和无源蜂鸣器的区别。 硬件电路设计 开发板上的蜂鸣器驱动电路如下图所示&#xff0c;使用的蜂鸣器是3V有源蜂鸣器&#xff0c;这里&#xff0c;我们有必要了解…

Vue学习——【第二弹】

前言 上一篇文章 Vue学习——【第一弹】 中我们学习了Vue的相关特点及语法&#xff0c;这篇文章接着通过浏览器中的Vue开发者工具扩展来进一步了解Vue的相关工作机制。 Vue的扩展 我们打开Vue的官方文档&#xff0c;点击导航栏中的生态系统&#xff0c;点击Devtools 接着我…

C/C++|物联网开发入门+项目实战|嵌入式C语言高级|简介及GCC参数|define|编译过程-学习笔记(7)

课程介绍 参考&#xff1a;麦子学院-嵌入式C语言高级 本套课程的定位 前导课程:掌握简单C语言的基本语法 计算机程序语言的学习思路? 基本程序设计思想&#xff0b;语言工具的特性 基本程序设计思想: 数据类型、运算符、条件分支、循环设计 面向对象的设计 C语言工具的特性…

数据库系统笔记CH5(初)

计组的知识 虚拟存储 IEEE754标准 5.1存储层级 二级存储器磁盘和固态硬盘 红色部分是磁道&#xff0c;蓝色部分是扇区&#xff0c;绿色指示部分是数据库中的一个块/页 块/页是我们用来存储介质的一个物理单元,数据写入磁盘以块位单位写入内存,一个块的大小一般是4KB或者8KB&…

项目管理中,这些思维误区一定要避开

项目需要在限定的时间要求完成的事情&#xff0c;可控的关键把握是&#xff1a;人、时、事。 但是&#xff0c;项目实施时间一般较长&#xff0c;总有很多项目实施结果不尽人意。那么&#xff0c;IT项目管理过程中&#xff0c;容易出现哪些思维误区呢&#xff1f; 1、忘记项…

react性能优化之shouldComponentUpdate的原理剖析

shouldComponentUpdate原理讲解shouldComponentUpdate是干什么的怎么使state更新而render函数不执行呢&#xff1f;使用shouldComponentUpdate完成性能优化当组件的state没有变化&#xff0c;props也没有变化&#xff0c;render函数可能执行吗&#xff1f;pureComponent的基本用…

北京小厂Java实习面经

目录1.数据库的三大范式2.事务四个特性3.知道多少种索引&#xff0c;分别讲讲4.主键索引和唯一索引的区别5.索引失效的场景6.数据库的日志知道哪些&#xff0c;分别讲讲7.redis的数据结构和应用场景8.缓存击穿是怎么产生的&#xff0c;解决方案9.redis中key的过期策略10.redis内…

达梦数据库支持GB18030-2022中文编码字符集证明方法

既然是证明就要做到有图有真相。 证明途径1&#xff1a;系统概览法 查看达梦数据库“管理工具”->“对象导航”->“管理服务器”-“系统概览”->“字符集编码”->”GB18030”. 看见”GB18030”字样就是证据之一。如果你没有看见这个字样&#xff0c;而是UTF8等其…

1. 大端法和小端法

int32_t num 0x01020304;一个int32_t是4个字节&#xff0c;在内存中的存储是高位字节在低地址&#xff0c;低位字节在高地址。 &#xff08;数字&#xff09;前者的高低是数字位数的高低&#xff0c;左边是高位数&#xff0c;右边是低位数&#xff1b; &#xff08;地址&…

git代码使用空格缩进

1、idea设置缩进符为空格 Java 代码 golang 代码 2、设置提交仓库时的空格处理&#xff0c;否则 golang 代码为了减少文件大小&#xff0c;可能会把空格缩进改为制表符。 设置当前仓库配置 git config core.whitespace "-trailing-space,space-before-tab" 设置当前…

Pytorch深度学习实战3-7:详解数据加载DataLoader与模型处理

目录1 数据集Dataset2 数据加载DataLoader3 常用预处理方法4 模型处理5 实例&#xff1a;MNIST数据集处理1 数据集Dataset Dataset类是Pytorch中图像数据集操作的核心类&#xff0c;Pytorch中所有数据集加载类都继承自Dataset父类。当我们自定义数据集处理时&#xff0c;必须实…

从TOP25榜单,看半导体之变

据SIA报告显示&#xff0c;2022年全球半导体销售额创历史新高达到5740亿美元。尽管2022年下半年&#xff0c;半导体市场出现了周期性的低迷&#xff0c;但其全年的销售额相较2021年增长了3.3%。 近日&#xff0c;市调机构Gartner发布了全球以及中国大陆TOP25名半导体厂商的排名…

js数组API的时间复杂度大全

一句话总结&#xff1a; 数组为连续且有序的数据结构, 所以若根据下标查找则很快&#xff0c;index[i]一步到位就可实现查询&#xff0c;若遍历查找则很慢(相对而言)。而插入和删除&#xff0c;除了数组末尾的增删很快&#xff0c;其它处则很慢&#xff0c;因为若数组某处要插入…

【服务器数据恢复】 重装系统导致xfs文件系统分区丢失的数据恢复案例

服务器数据恢复环境&#xff1a; EMC某型号存储&#xff0c;20块磁盘组建raid5磁盘阵列&#xff0c;划分2个lun。 服务器故障&#xff1a; 管理员执行重装系统操作后发现分区发生改变&#xff0c;原先的sdc3分区丢失&#xff0c;该分区采用xfs文件系统&#xff0c;存储了公司重…

开放式耳机好用吗,推荐几款不错的开放式耳机

​开放式耳机是一种新型的耳机&#xff0c;相比于传统的耳机&#xff0c;开放式耳机听歌时不需要将耳朵堵上&#xff0c;不会因为长时间佩戴而对听力造成损害。它不需要入耳也能听到声音&#xff0c;在户外运动时能够及时听到环境音&#xff0c;避免安全隐患。现在在骨传导市面…

nodejs+vue 沃健身房管理系统

3)系统分析 本章主要是对系统可行性、系统性能、还有系统功能需求进行分析。 (4)系统设计 对系统系统功能和数据库等进行详细讲解。 (5)系统的实现 主要对个人中心、课程分类管理、用户管理、健身器材管理、健身教练管理、预约教练管理、健身课程管理、课程订单管理、健身视频管…

ESP32学习笔记08-adc单通道数据采集

8. adc单通道数据采集 8.1RTC SAR ADC 控制器 8.2ADC相关的api 8.2.1 配置adc的位宽 esp_err_t adc1_config_width(adc_bits_width_t width_bit);width_bit :位宽 返回值 ESP_OK 配置成功 ESP_ERR_INVALID_ARG 参数错误 esp32最大的宽度的12位typedef enum {