Druid的数据结构

Druid的数据结构

Druid数据存储结构可以分为三层:

  1. DataSource
  2. Chunk
  3. Segment

DataSource相当于MySQL的按时间分区的表,Chunk相当于MySQL中的按时间分区的表一个分区,但是Chunk不是一个实体,只是一个虚拟的概念,一个Chunk中可以有多个Segment。
在最终落地的文件结构(可以存在本地文件、HDFS中)中,一个DataSource占用一个目录,该目录下包含若干个Segment文件,Segment文件名中包含该Segment所属的DataSource名、内含数据的时间区间、分区序号,每个Segment都是一个压缩文件。
Druid的DataSource本身不维护元数据,每一个Segment内部包含了该Segment的所有列信息;一个DataSource下的各Segment的字段可以不同,Druid允许在同一个DataSource下存放不同字段数、字段名的Segment,在做数据入库的时候不做格式合法性检查,查询的时候针对缺失字段提供默认行为(缺失的数值型字段取默认值0,缺失的字符串型字段取默认值null)。

Segment的数据结构

Segment的字段分为三类:

  1. TimeStamp
  2. Dimension
  3. Metric

TimeStamp是固定字段,每个Segment都必须有一个TimeStamp类型字段,字段名可以由用户指定;Dimension是维度字段,可以是数值型、字符串型;Metric是指标字段,必须是数值型。
Druid的数据是按列存储的,每一列的所有数据都存储在一段连续的文件地址内,执行查询的时候只需要访问相关的列即可,而且由于列内数据的存储地址是连续的,所以读取每一列的数据都很快。
TimeStamp和Metric类型的列的存储格式都比较简单,只是单纯地把所有数据按照LZ4的格式压缩存储而已,而Dimension类型的列的存储格式比较复杂,包含如下结构:

  1. 一个把所有取值(不管Dimension是什么类型,存储时都被视为是字符串类型)和连续的数字ID一一匹配的字典
  2. 该列的所有行的取值对应的数字ID按顺序存储
  3. 一个倒排索引字典,key是该列的所有取值,value是一个列表,如果第N行的该列取值为key,则该列表的第N项就是1,否则是0

这些数据结构都是为提高查询速度而服务的,第一条是基础,第二条在处理groupBy/topN这类查询时效率很高,第三条(倒排索引)在处理查询的AND/OR的联合筛选时效率很高。
示例如下:

1: Dictionary that encodes column values
  {
    "Justin Bieber": 0,
    "Ke$ha":         1
  }

2: Column data
  [0,
   0,
   1,
   1]

3: Bitmaps - one for each unique value of the column
  value="Justin Bieber": [1,1,0,0]
  value="Ke$ha":         [0,0,1,1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值