之前对列式存储接触的不太多, 我想从 hbase 入手, 学习一下列式数据库的基本原理和存储结构;
逻辑结构
hbase 不是传统的列式存储结构, 而是按列族聚合的存储结构;
hbase 表的行结构:1
2# 按照 rowkey 的字典序升序排列
(rowkey, columnFamily, column) -> (value, timestamp)
1 | SortedMap<RowKey, List<SortedMap<Column, List<value, Timestamp>>>> |
详细示例
逻辑数据
RowKey | name | age | phone | last_login | login_count | |
---|---|---|---|---|---|---|
user001 | 张三 | 28 | [email protected] | 13800138001 | 10:30:00 | 42 |
user002 | 李四 | 32 | [email protected] | 13900139002 | 14:15:00 | 27 |
表结构
列族定义:
- basic_info (基本信息)
- 列: name, age
- contact_info (联系信息)
- 列: email, phone
- activity_info (活动信息)
- 列: last_login, login_count
建表语句:1
create 'my_table', {NAME => 'basic_info', VERSIONS => 1}, {NAME => 'contact_info', VERSIONS => 1}, {NAME => 'activity_info', VERSIONS => 1}
物理存储的逻辑结构
hbase 在磁盘上会按列族分开存储, 每个列族对应一个独立的存储文件 (HFile), 以下是实际存储的逻辑视图:
列族 basic_info 的存储文件
1
2
3
4
5
6RowKey | Column Qualifier | Timestamp | Value
----------|------------------|---------------|---------
user001 | name | 1692066600000 | 张三
user001 | age | 1692066600000 | 28
user002 | name | 1692159300000 | 李四
user002 | age | 1692159300000 | 32列族 contact_info 的存储文件
1
2
3
4
5
6RowKey | Column Qualifier | Timestamp | Value
----------|------------------|---------------|-----------------------
user001 | email | 1692066600000 | [email protected]
user001 | phone | 1692066600000 | 13800138001
user002 | email | 1692159300000 | [email protected]
user002 | phone | 1692159300000 | 13900139002列族 activity_info 的存储文件
1
2
3
4
5
6RowKey | Column Qualifier | Timestamp | Value
----------|------------------|---------------|-----------------------
user001 | last_login | 1692066600000 | 10:30:00
user001 | login_count | 1692066600000 | 42
user002 | last_login | 1692159300000 | 14:15:00
user002 | login_count | 1692159300000 | 27