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的过程以及位图索引的实现过程。