由于业务的须要,接触了关于数据库链接池druid的查询,由于对于这方面的生疏,刚刚开始的时候为了快速上手,仅仅局限于使用。由于不多接触大数据,对于里面的一些概念理解不透彻走了很多的弯路,一周时间的探索,如今终于也有了一个比较正确的认识,因此在这里开篇作一个总结。
从什么角度去理解druid其实很重要,做为一个前端,一开始我只是把druid当成一个工具来理解,当成是一个以json为查询方式、链接数据库的链接池。结合同事以前编写的代码,致使了我只想知道两个重点:javascript
因而我翻开了文档,把要用的查询方式(timeseries、topN、GroupBy、Time Boundary、Segment Metadata、Datasource Metadata、select、search、scan)都过了一遍,总计9种查询,每种查询都是不一样的查询条件而且返回不一样格式的数据,毫无疑问很是崩溃……大脑很是抵触这种记忆的方式,因而我前几天不断地往返于文档和代码之间,很是低效。html
我开始意识到我如今不能想着赶忙把需求作完,而是应该跳到一个更高的层面去理解druid,因而我带着几个疑问从新开始学习了一遍druid前端
首先从文档中的概览能够知道,druid是一款高性能、面向列的分布式存储,专门为实时数据和历史数据提供亚秒级别的查询而设计。主要用于统计数据的商业智能(OLAP)查询,而且可以支持快速的多维过滤,特设属性分组,以及极快的聚合。java
其次须要了解一个关键词OLAP,我的理解druid是对OLAP的具体实现,概念来自于此。数据库
联机分析处理OLAP是一种软件技术,它使分析人员可以迅速、一致、交互地从各个方面观察信息,以达到深刻理解数据的目的。它具备FASMI(Fast Analysis of Shared Multidimensional Information),即共享多维信息的快速分析的特征。其中F是快速性(Fast),指系统能在数秒内对用户的多数分析要求作出反应;A是可分析性(Analysis),指用户无需编程就能够定义新的专门计算,将其做为分析的一部 分,并以用户所但愿的方式给出报告;M是多维性(Multi—dimensional),指提供对数据分析的多维视图和分析;I是信息性(Information),指能及时得到信息,而且管理大容量信息。 -- 百度百科
其实很好理解,当面对庞大的数据要作分析的时候,观察一些局部琐碎的点实际上没有太大的意义,咱们应该要总结一套高效通用的方法去分析,好比分时间点的数据采集,以及对数据的进行聚合,去研究趋势,而OLAP定义了一整套这样便于分析的体系。编程
对于数据,咱们把它当成是个多维度的超立方体,分析者能够经过不一样的维度观察数据。json
对于查询到的数据,定义了如下操做缓存
这时候咱们再回过头来看druid,已经再也不茫然。分布式
如今咱们返回来看druid数据,全部的查询都围绕时间的维度。工具
timestamp | publisher | advertiser | gender | country | click | price |
---|---|---|---|---|---|---|
2011-01-01T01:01:35Z | bieberfever.com | google.com | Male | USA | 0 | 0.65 |
2011-01-01T01:03:63Z | bieberfever.com | google.com | Male | USA | 0 | 0.62 |
2011-01-01T01:04:51Z | bieberfever.com | google.com | Male | USA | 1 | 0.45 |
2011-01-01T01:00:00Z | ultratrimfast.com | google.com | Female | UK | 0 | 0.87 |
2011-01-01T02:00:00Z | ultratrimfast.com | google.com | Female | UK | 0 | 0.99 |
2011-01-01T02:00:00Z | ultratrimfast.com | google.com | Female | UK | 1 | 1.53 |
一段数据中包含了三个组件:
druid能够以(数据源-时间范围-版本号-段号)结合为一个维度配合时间戳对数据进行切片,这样的一个单元称之为段(segment)
好比咱们为了观察一篇文章点击量上升的趋势,咱们每隔一个小时灌入一次数据,所以产生了两个分段
timestamp | publisher | advertiser | gender | country | click |
---|---|---|---|---|---|
2011-01-01T01:00:00Z | ultratrimfast.com | google.com | Male | USA | 1800 |
2011-01-01T01:00:00Z | bieberfever.com | google.com | Male | USA | 2912 |
timestamp | publisher | advertiser | gender | country | click |
---|---|---|---|---|---|
2011-01-01T02:00:00Z | ultratrimfast.com | google.com | Male | USA | 2200 |
2011-01-01T02:00:00Z | bieberfever.com | google.com | Male | USA | 3309 |
如今咱们要看每一个时间段内产生的点击量的总和。咱们假设每一个分段内,只采集了一次数据,时间点相同,基于timestamp 作一次rollup,因而产生了两条数据,点击数产生了一次聚合。
timestamp | click |
---|---|
2011-01-01T01:00:00Z | 4712 |
2011-01-01T02:00:00Z | 5509 |
咱们已经将用到的基本概念都过了一遍,如今是时候落地到查询了。druid的原生查询语言是JSON,固然各大开源社区的贡献使其也支持了其余语言的查询,包括SQL。
druid的查询分为三大类,分别是聚合查询,元数据查询以及普通查询
普通的查询包括
聚合查询
元数据查询
咱们也不通篇过文档了,普通的查询没什么好讲的,只有一个须要注意的点,那就是select在查询大量的数据的时候,很消耗内存,若是没有分页的需求,能够用scan替代。
元数据的查询,主要不是基于业务的查询,而是对当前表的属性,或者是定义列的类型这一类属性的查询,好比xxx表中"country"是什么类型的数据,xxx表收集数据起止时间,或者当前分段的版本是什么之类的信息。
主要须要理解的是三种内置的聚合查询,本质上作的操做是这样的
查询的条件
${age} year old
的形式展示。学习druid的过程,最大的收获其实并非掌握druid自己,而是学到了他贯彻的OLAP的一些概念,从一开始的毫无所知,带着一点线索向上探索,到慢慢知晓通篇,真是一个有趣的过程,实际上懂了OLAP,很快也能掌握其余数据库的查询,真正作到了举一反三,带着这套思路相信很快也能上手SQL了,开心😊。但愿能对你们上手起到帮助吧,共勉!