【ClickHouse 技术系列】- ClickHouse 中的嵌套数据结构
简介:本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国内外公司广泛采用。本系列技术文章,将详细展开介绍 ClickHouse。
前言
本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB 级的数据规模,简单的架构,被国内外公司广泛采用。
阿里云 EMR-OLAP 团队,基于开源 ClickHouse 进行了系列优化,提供了开源 OLAP 分析引擎 ClickHouse 的云上托管服务。EMR ClickHouse 完全兼容开源版本的产品特性,同时提供集群快速部署、集群管理、扩容、缩容和监控告警等云上产品功能,并且在开源的基础上优化了 ClickHouse 的读写性能,提升了 ClickHouse 与 EMR 其他组件快速集成的能力。访问 ClickHouse - E-MapReduce - 阿里云 了解详情。
译者:何源(荆杭),阿里云计算平台事业部高级产品专家
ClickHouse 中的嵌套数据结构
在这篇博客文章中,我们将了解 ClickHouse for MySQL 中的嵌套数据结构,以及如何将其与 PMM 结合使用来查看查询。
嵌套结构在关系数据库管理系统中并不常见。通常情况下,它只是平面表。有时,将非结构化信息存储在结构化数据库中会很方便。
我们正在努力将 ClickHouse 调整为用于 Percona 监控和管理 (PMM) 的长期存储,尤其是存储有关查询的详细信息。我们试图解决的问题之一是,对导致特定查询失败的不同错误进行计数。
例如,对于日期为 2017-08-17 的查询:
"SELECT foo FROM bar WHERE id=?"
被执行了 1000 次。其中 25 次失败的错误代码为“1212”,8 次失败的错误代码为“1250”。当然,在关系数据中进行存储的传统方法是创建一个表 "Date, QueryID, ErrorCode, ErrorCnt",然后对这个表执行 JOIN。遗憾的是,列式数据库在多个 Join 的情况下表现不佳,通常建议使用非规范化表。
我们可以为每个可能的 ErrorCode 创建一个列,但这并不是最优解。可能有成千上万的列,而且大多数时候它们都是空的。
在这种情况下,ClickHouse 提出了嵌套数据结构。对于我们的情况,这些可以定义为:
CREATE TABLE queries (Period Date,QueryID UInt32,Fingerprint String,Errors Nested(ErrorCode String,ErrorCnt UInt32) )Engine=MergeTree(Period,QueryID,8192);
这个解决方案有明显的问题:我们如何在这个表中插入数据?我们如何提取它?
我们先从 INSERT 开始。插入可能如下所示:
INSERT INTO queries VALUES ('2017-08-17',5,'SELECT foo FROM bar WHERE id=?',['1220','1230','1212'],[5,6,2])
这意味着 2017-08-17 期间插入的查询出现了 5 次错误 1220,6 次错误 1230,2 次错误 1212。
那么在不同的日期,它可能会产生不同的错误:
INSERT INTO queries VALUES ('2017-08-18',5,'SELECT foo FROM bar WHERE id=?',['1220','1240','1258'],[3,2,1])
让我们看一下 SELECT 数据的方法。非常基础的 SELECT:
SELECT * FROM queries |_____Period_|_QueryID_|_Fingerprint_|_Errors.ErrorCode_______|_Errors.ErrorCnt_| | 2017-08-17 | 5 | SELECT foo | ['1220','1230','1212'] | [5,6,2] | | 2017-08-18 | 5 | SELECT foo | ['1220','1240','1260'] | [3,16,12] | |____________|_________|_____________|________________________|_________________|
如果我们想使用更熟悉的表格输出,则可以使用 ARRAY JOIN 扩展:
SELECT * FROM queries ARRAY JOIN Errors ┌─────Period─┬─QueryID─┬─Fingerprint─┬─Errors.ErrorCode─┬─Errors.ErrorCnt─┐ │ 2017-08-17 │ 5 │ SELECT foo │ 1220 │ 5 │ │ 2017-08-17 │ 5 │ SELECT foo │ 1230 │ 6 │ │ 2017-08-17 │ 5 │ SELECT foo │ 1212 │ 2 │ │ 2017-08-18 │ 5 │ SELECT foo │ 1220 │ 3 │ │ 2017-08-18 │ 5 │ SELECT foo │ 1240 │ 16 │ │ 2017-08-18 │ 5 │ SELECT foo │ 1260 │ 12 │ └────────────┴─────────┴─────────────┴──────────────────┴─────────────────┘
但是,通常我们希望看到多个期间的聚合,这可以通过传统的聚合函数来完成:
SELECT QueryID,Errors.ErrorCode,SUM(Errors.ErrorCnt) FROM queries ARRAY JOIN Errors GROUP BY QueryID,Errors.ErrorCode ┌─QueryID─┬─Errors.ErrorCode─┬─SUM(Errors.ErrorCnt)─┐ │ 5 │ 1212 │ 2 │ │ 5 │ 1230 │ 6 │ │ 5 │ 1260 │ 12 │ │ 5 │ 1240 │ 16 │ │ 5 │ 1220 │ 8 │ └─────────┴──────────────────┴──────────────────────┘
如果我们别出心裁,每个 QueryID 只返回一行,我们也可以这么做:
SELECT QueryID, groupArray((ecode, cnt)) FROM (SELECT QueryID, ecode, sum(ecnt) AS cntFROM queries ARRAY JOIN Errors.ErrorCode AS ecode, Errors.ErrorCnt AS ecntGROUP BY QueryID, ecode ) GROUP BY QueryID ┌─QueryID─┬─groupArray(tuple(ecode, cnt))──────────────────────────────┐ │ 5 │ [('1230',6),('1212',2),('1260',12),('1220',8),('1240',16)] │ └─────────┴────────────────────────────────────────────────────────────┘
结论
ClickHouse 提供了灵活的方式来存储数据,尽管它是一个列式数据库,但可以实现较低的结构化程度,并提供各种函数来提取和聚合数据。
后续
您已经了解了在 ClickHouse 中处理实时更新相关内容,本系列还包括其他内容:
- 在 ClickHouse 中处理实时更新
- 使用新的 TTL move,将数据存储在合适的地方
- 在 ClickHouse 物化视图中使用 Join
- ClickHouse 聚合函数和聚合状态
- ClickHouse 中的嵌套数据结构(本文)
原文链接
本文为阿里云原创内容,未经允许不得转载。
【ClickHouse 技术系列】- ClickHouse 中的嵌套数据结构相关推荐
- 【ClickHouse 技术系列】- 在 ClickHouse 中处理实时更新
简介:本文翻译自 Altinity 针对 ClickHouse 的系列技术文章.面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国 ...
- 【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态
简介:本文翻译自 Altinity 针对 ClickHouse 的系列技术文章.面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国 ...
- 擎创技术流 | ClickHouse实用工具—ckman教程(7)
一期一会的"ckman"教程又跟大家见面了,本期分享的重点主要针对上期后台陆续收到的问题展开,解答完问题后再带入一些关于"ckman"升级的相关讲解.感兴 ...
- 擎创技术流 | ClickHouse实用工具—ckman教程(5)
哈喽~友友们,又到了一期一会的技术分享时刻了,本期继续以视频形式与大家分享,话不多说,我们直接上干货,建议收藏分享马住 戳↓↓↓链接,一键回看前期内容: 擎创技术流 | ClickHouse实用工具- ...
- 擎创技术流 | ClickHouse实用工具—ckman教程(6)
哈喽~小伙伴们,今天依旧是每一周一期的技术分享~ 关于"ckman"的技术分享已经第6期了,大家是不是跟小编一样收获颇丰?新知识虽然新鲜有趣,但也别忘了回顾旧知识巩固基础噢~↓↓↓ ...
- 擎创技术流 | ClickHouse实用工具—ckman教程(4)
<使用CKman导入集群> CKman(ClickHouse Manager)是由擎创科技自主研发的一款管理ClickHouse的工具,前端用Vue框架,后端使用Go语言编写.它主要用来 ...
- 漫谈 ClickHouse 在实时分析系统中的定位与作用
ClickHouse 是一款由俄罗斯Yandex公司开源的OLAP数据库,拥有着卓越的性能表现,在官方公布的基准测试中,ClickHouse的平均响应速度是Vertica的2.63倍.InfiniDB ...
- dataframe数组做元素_大数据技术之使用 DataFrame 读取复杂 JSON 中的嵌套数组
本篇教程探讨了大数据技术之使用 DataFrame 读取复杂 JSON 中的嵌套数组,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入. 众所周知,在早期Spark版本中就已经支持 ...
- ClickHouse技术分享第二弹(英文讲义)
前言 以下是今天为公司小伙伴们做的ClickHouse技术分享的讲义.由于PPT太难做了,索性直接用Markdown来写,搭配Chrome上的Markdown Preview Plus插件来渲染,效果 ...
最新文章
- linux格式化分区进程,linux磁盘分区格式化
- google gperf tool【cpu】
- 作业帮电脑版在线使用_互助作业帮PC版-互助作业帮电脑版下载 v4.5.8
- Java面试常问计算机网络问题
- 将原生SQL功能休眠到您的Spring Data Repository中
- access文本框如何分开_ACCESS 2007 如何在窗体中将一个文本框的内容复制给另外一个文本框?...
- [翻译] TGLStackedViewController
- ArcGIS的文件结构
- easyui-validatebox验证 radio
- [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations
- 祖传CMOS走出家门,佳能将在传感器供应圈中决战索尼
- Springboot使用POI读写excel(详细)
- InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?
- awesome-adb
- Scratch编程与数学结合-蜗牛爬井问题
- 10种世界上最美的花
- 马尔可夫过程(Markov Process)和马尔可夫链
- PCIE 调试过程记录
- android调用相机返回大图,Android调用相机拍照返回原图
- DP1.4协议学习(二)Link层功能概述
热门文章
- shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记
- html中什么是语义,html – “语义正确”是什么意思?
- 如何做电脑桌面应用_CAD批量转PDF?一分钟教会你CAD如何转PDF,两种方法任你选择!...
- hash hashcode变化_Web安全 | 没想到 Hash 冲突还能这么玩,你的服务中招了吗?
- python怎么画参数函数图像_详解pandas.DataFrame.plot() 画图函数
- Java 启动和停止界面_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...
- flask 获取前端form内容_flask 项目中使用 bootstrapFileInput(进阶篇)
- redis关键字删除_微信公众号文章防删除
- layui 如何去dom_常用元素操作 - layui.element
- 致准医学博士生的乘风破浪秘籍