Apache Druid 系列文章
1、Druid(Imply-3.0.4)介绍及部署(centos6.10)、验证 2、Druid的入门示例(使用三种不同的方式摄入数据和提交任务) 3、Druid的load data 示例(实时kafka数据和离线-本地或hdfs数据) 4、java操作druid api 5、Druid配置文件详细介绍以及示例 6、Druid的Roll up详细介绍及示例
(文章目录)
本文介绍了druid 的 rool-up过程以及位图索引构建过程、实际的应用过程。 本文分为1个部分,即介绍与示例。
一、介绍及示例
1、介绍
Apache Druid可以通过roll-up在数据摄取阶段对原始数据进行汇总。 Roll-up是对选定列集的一级聚合操作,它可以减小存储数据的大小。 本文将讨论在一个示例数据集上进行roll-up的结果。
- Druid通过一个roll-up的处理,将原始数据在注入的时候就进行汇总处理
- roll-up可以压缩我们需要保存的数据量
- Druid会把选定的相同维度的数据进行聚合操作,可减少存储的大小
- Druid可以通过 queryGranularity 来控制注入数据的粒度。 最小的queryGranularity 是 millisecond(毫秒级)
2、示例数据
Roll-up聚合前
Roll-up聚合后 1、位图索引
3、过程示例
以下为一个DataSource(表)中存储的数据
1)、原始存储数据及数据结构
数据结构说明:第一列为时间,Appkey和area都是维度列,value为metric列
2)、摄入Druid
按天聚合后的数据,如下。 说明:Druid会在导入阶段自动对数据进行Rollup,将维度相同组合的数据进行聚合处理
3)、Druid聚合过程
Druid通过建立位图索引,来实现快速进行数据查找。 索引位图可以看作是HashMap<String, Bitmap>
- key就是维度的取值
- value就是该表中对应的行是否有该维度的值
索引如下所示 说明:0表示行内没有,1表示行内有该数据
4)、条件查询过程示例
select
sum(value)
from AD_areauser
where
time=’2023-01-04’ and
Appkey in (‘appkey1’,’appkey2’) and
area=’beijng’
执行过程
- 根据时间段定位到segment
- Appkey in ('appkey1', 'appkey2') and area=’beijing’查到各自的bitmap ( appkey1(1000) or appkey2(0110) ) and ( beijing (1100) ) = (1000 or 0110 ) and ( 1100 )= 1110 and 1100 =1100
- 符合条件的列为第一行和第二行,这两行的 sum(value) 的和为26.
5)、group by查询过程示例
select
area,
sum(value)
from AD_areauser
where
time=’2023-01-04’ and
Appkey in (‘appkey1’,’appkey2’)
group by area
执行过程
- 根据时间段定位到segment
- Appkey in (‘appkey1’,’appkey2’)查到各自的bitmap appkey1(1000) or appkey2(0110) = ( 1110 )
- 将第一行、第二行、第三行取出来
- 在内存中做分组聚合,结果为:beijing:26, shanghai:13
以上,介绍了roll up的过程以及位图索引的实现过程。