1. 表存储结构
LOAD DATA INPATH '/local-path/sample.csv' INTO TABLE test_table;
insert into table test_table select '1', 'name1', 'city1', 1;
对表做了初始化,并且插入了一条数据, 形成如下的文件结构:
default/test_table/
├── Fact
│ └── Part0
│ ├── Segment_0
│ │ ├── 0_1595387884655.carbonindexmerge
│ │ └── part-0-0_batchno0-0-0-1595387882386.snappy.carbondata
│ └── Segment_1
│ ├── 1_1595388024054.carbonindexmerge
│ └── part-0-0_batchno0-0-1-1595388023733.snappy.carbondata
├── LockFiles
│ ├── Segment_0.lock
│ ├── Segment_1.lock
│ ├── compaction.lock
│ ├── meta.lock
│ └── tablestatus.lock
└── Metadata
├── schema
├── segments
│ ├── 0_1595387882386.segment
│ └── 1_1595388023733.segment
└── tablestatus
2. 数据文件结构

├── Blocket 1
│ ├── Column 1 Page group [ColumnChunk]
│ │ ├── Page 1
│ │ ├── Page 2
│ │ ├── Page Group Meta
│ │ └── Page N
│ └── Column N Page group
├── Blocket N
├── File Footer
└── File Header
2.1 Blocklet 3个版本的比较
版本 | 组成元素 | 特点 | 示意图 |
---|---|---|---|
V1 | 各种类型的Page | 列数据分散在各个Page里面,并且,根据Page的类型做了分组 |
![]() |
V2 | ColumnChunk | 列数据根据列做了分组,每列维护自己头信息 |
![]() |
V3 | ColumnChunk | 有多个DataChunk, 多组Page, 但还是按照列做了分区 |
![]() |
3种Page类型:
类型 | 作用 |
---|---|
Data Page | 包含列的编码数据 |
Row ID Page | 包含行 ID 的映射信息,当数据页面被存储为倒排索引时使用 |
RLE Page | 当数据页面使用 RLE 编码时使用 |
3. Footer结构

部分 | 作用 |
---|---|
BlockletInfo3 | 单个blocklet下的所有ColumnChunk3的长度和offset |
SegmentInfo | 单个数据文件(多个blocklet)下的列的个数和每列的大小 |
BlockletIndex | 包含BlockletMinMaxIndex和BlockletBTreeIndex |
- BlockletBTreeIndex: 记录单个blocklet下的startKey和endKey
- BlockletMinMaxIndex: 记录单个blocklet下每列的最大值和最小值
4. 索引结构
当每个task在写数据的时候, 一般会有多个的数据文件和1个索引文件, 这个索引文件记录的是这些数据文件种的blocklet的信息
字段 | 含义 |
---|---|
num_rows | 某个数据文件的条数 |
file_name | 数据文件的名称(因为会有多个) |
offset | footer offset |
block_index | BlockletIndex |
ref:
网友评论