目录
-
- 摘要
- 一、分布式表概述
-
- [1.1 什么是分布式表](#1.1 什么是分布式表)
- [1.2 分布式表特点](#1.2 分布式表特点)
- [1.3 分布式表 vs 内存表](#1.3 分布式表 vs 内存表)
- 二、创建分布式表
-
- [2.1 创建分布式数据库](#2.1 创建分布式数据库)
- [2.2 创建分布式表](#2.2 创建分布式表)
- [2.3 创建维度表](#2.3 创建维度表)
- 三、数据写入
-
- [3.1 批量写入](#3.1 批量写入)
- [3.2 并行写入](#3.2 并行写入)
- [3.3 流式写入](#3.3 流式写入)
- 四、数据查询
-
- [4.1 基本查询](#4.1 基本查询)
- [4.2 分区裁剪](#4.2 分区裁剪)
- [4.3 聚合查询](#4.3 聚合查询)
- [4.4 分布式计算](#4.4 分布式计算)
- 五、表管理
-
- [5.1 查看表信息](#5.1 查看表信息)
- [5.2 更新数据](#5.2 更新数据)
- [5.3 删除数据](#5.3 删除数据)
- [5.4 删除表](#5.4 删除表)
- 六、分区管理
-
- [6.1 查看分区](#6.1 查看分区)
- [6.2 添加分区](#6.2 添加分区)
- [6.3 删除分区](#6.3 删除分区)
- 七、副本管理
-
- [7.1 副本配置](#7.1 副本配置)
- [7.2 副本状态](#7.2 副本状态)
- 八、实战案例
-
- [8.1 工业物联网数据平台](#8.1 工业物联网数据平台)
- 九、总结
- 参考资料
摘要
本文深入讲解DolphinDB分布式表的创建与管理。从分布式表原理到创建方法,从数据写入到查询优化,从分区管理到运维监控,全面介绍分布式表的核心操作。通过丰富的代码示例,帮助读者掌握分布式表的设计和管理技能。
一、分布式表概述
1.1 什么是分布式表
分布式表是存储在分布式数据库中的表,数据按分区分布在多个节点上:
分布式表架构
客户端
Controller
DataNode1
DataNode2
DataNode3
分区1,3,5
分区2,4,6
分区7,9,11
1.2 分布式表特点
| 特点 | 说明 |
|---|---|
| 分布式存储 | 数据分布在多个节点 |
| 水平扩展 | 支持PB级数据 |
| 高可用 | 多副本机制 |
| 并行计算 | 分布式计算加速 |
1.3 分布式表 vs 内存表
| 特性 | 内存表 | 分布式表 |
|---|---|---|
| 存储位置 | 内存 | 磁盘 |
| 容量 | 受内存限制 | PB级 |
| 持久化 | 需手动 | 自动持久化 |
| 查询速度 | 快 | 较快 |
| 适用场景 | 临时数据 | 海量数据 |
二、创建分布式表
2.1 创建分布式数据库
python
// 创建VALUE分区数据库
db = database("dfs://iot_db", VALUE, 1..100)
// 创建RANGE分区数据库
db = database("dfs://iot_db", RANGE, 2024.01.01..2024.12.31)
// 创建COMPO组合分区数据库
db = database("dfs://iot_db", COMPO,
[RANGE, 2024.01.01..2024.12.31,
HASH, [INT, 10]])
2.2 创建分布式表
python
// 创建分布式数据库
db = database("dfs://iot_db", VALUE, 1..100)
// 定义表结构
schema = table(1:0,
`device_id`timestamp`temperature`humidity`pressure,
[INT, TIMESTAMP, DOUBLE, DOUBLE, DOUBLE])
// 创建分布式表
db.createPartitionedTable(schema, `sensor_data, `device_id)
// 查看表结构
schema(loadTable("dfs://iot_db", "sensor_data"))
2.3 创建维度表
python
// 维度表:小表,广播到所有节点
db = database("dfs://metadata")
// 创建设备信息维度表
schema = table(1:0,
`device_id`device_name`location`install_date`status,
[INT, STRING, STRING, DATE, SYMBOL])
db.createTable(schema, `device_info)
// 插入数据
loadTable("dfs://metadata", "device_info").append!(
table(
1..100 as device_id,
"device_" + string(1..100) as device_name,
take(`车间A`车间B`车间C, 100) as location,
take(2024.01.01, 100) as install_date,
take(`在线, 100) as status
)
)
三、数据写入
3.1 批量写入
python
// 批量写入数据
t = table(
take(1..100, 10000) as device_id,
take(now(), 10000) as timestamp,
rand(20.0..30.0, 10000) as temperature,
rand(40.0..60.0, 10000) as humidity,
rand(1000.0..1020.0, 10000) as pressure
)
loadTable("dfs://iot_db", "sensor_data").append!(t)
3.2 并行写入
python
// 并行写入函数
def parallelWrite(dbPath, tableName, data) {
loadTable(dbPath, tableName).append!(data)
}
// 使用mr并行写入
data_list = split(t, 10) // 分成10份
mr(data_list, parallelWrite{"dfs://iot_db", "sensor_data"})
3.3 流式写入
python
// 创建流表
share streamTable(1:0,
`device_id`timestamp`temperature`humidity`pressure,
[INT, TIMESTAMP, DOUBLE, DOUBLE, DOUBLE]) as input_stream
// 订阅流表,写入分布式表
subscribeTable(, "input_stream", "persist", -1,
def(msg) {
loadTable("dfs://iot_db", "sensor_data").append!(msg)
}, true, 10000, true)
// 写入流表
input_stream.append!(t)
四、数据查询
4.1 基本查询
python
// 加载分布式表
t = loadTable("dfs://iot_db", "sensor_data")
// 查询数据
select count(*) from t
select top 100 * from t
select * from t where device_id = 1
4.2 分区裁剪
python
// 分区裁剪优化查询
t = loadTable("dfs://iot_db", "sensor_data")
// 按分区列过滤(高效)
select count(*) from t where device_id in [1, 2, 3]
// 查看执行计划
explain select * from t where device_id = 1
4.3 聚合查询
python
// 分组聚合
select device_id,
count(*) as cnt,
avg(temperature) as avg_temp,
max(temperature) as max_temp,
min(temperature) as min_temp
from t
group by device_id
// 时间窗口聚合
select bar(timestamp, 1h) as hour,
avg(temperature) as avg_temp
from t
where device_id = 1
group by bar(timestamp, 1h)
4.4 分布式计算
python
// 分布式计算使用mr函数
def mapFunc(data) {
return select device_id, avg(temperature) as avg_temp
from data
group by device_id
}
def reduceFunc(results) {
return unionAll(results)
}
// 执行分布式计算
mr(sqlDS(<select * from t>), mapFunc, reduceFunc)
五、表管理
5.1 查看表信息
python
// 查看表结构
schema(loadTable("dfs://iot_db", "sensor_data"))
// 查看表大小
getTabletsMeta("dfs://iot_db", "sensor_data")
// 查看分区分布
select partition, count(*) as cnt
from getTabletsMeta("dfs://iot_db", "sensor_data")
group by partition
5.2 更新数据
python
// 更新分布式表
t = loadTable("dfs://iot_db", "sensor_data")
// 条件更新
update t set temperature = temperature * 1.1
where device_id = 1
// 注意:更新操作需要指定分区条件
5.3 删除数据
python
// 删除数据
t = loadTable("dfs://iot_db", "sensor_data")
// 条件删除
delete from t where device_id = 1
// 清空表
truncate(t)
5.4 删除表
python
// 删除分布式表
dropTable(database("dfs://iot_db"), "sensor_data")
// 删除数据库
dropDatabase("dfs://iot_db")
六、分区管理
6.1 查看分区
python
// 查看分区方案
db = database("dfs://iot_db")
db.partitionSchema()
// 查看分区详情
getTabletsMeta("dfs://iot_db", "sensor_data")
6.2 添加分区
python
// 添加新分区(RANGE分区)
db = database("dfs://iot_db")
addPartitions(db, [2025.01.01, 2025.02.01])
6.3 删除分区
python
// 删除分区
db = database("dfs://iot_db")
dropPartition(db, [2023.01.01])
七、副本管理
7.1 副本配置
python
// 创建带副本的数据库
db = database("dfs://iot_db_replica", VALUE, 1..100, replica=2)
// 查看副本配置
db.replicationFactor()
7.2 副本状态
python
// 查看副本状态
getClusterReplicationStatus()
// 查看副本同步状态
getReplicationDelay()
八、实战案例
8.1 工业物联网数据平台
python
// ========== 1. 创建分布式数据库 ==========
db = database("dfs://iot_platform", COMPO,
[RANGE, 2024.01.01..2024.12.31,
HASH, [INT, 100]], replica=2)
// ========== 2. 创建设备数据表 ==========
schema = table(1:0,
`device_id`timestamp`temperature`humidity`pressure`vibration`power`status,
[INT, TIMESTAMP, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, SYMBOL])
db.createPartitionedTable(schema, `device_data, `timestamp`device_id)
// ========== 3. 创建告警表 ==========
schema = table(1:0,
`alert_id`device_id`timestamp`alert_type`alert_level`message,
[LONG, INT, TIMESTAMP, SYMBOL, INT, STRING])
db.createPartitionedTable(schema, `alert_data, `timestamp`device_id)
// ========== 4. 创建统计表 ==========
schema = table(1:0,
`device_id`date`avg_temp`max_temp`min_temp`record_count,
[INT, DATE, DOUBLE, DOUBLE, DOUBLE, LONG])
db.createPartitionedTable(schema, `daily_stats, `date`device_id)
// ========== 5. 数据写入函数 ==========
def writeDeviceData(data) {
loadTable("dfs://iot_platform", "device_data").append!(data)
}
// ========== 6. 统计计算函数 ==========
def calcDailyStats() {
t = loadTable("dfs://iot_platform", "device_data")
stats = select device_id,
date(timestamp) as date,
avg(temperature) as avg_temp,
max(temperature) as max_temp,
min(temperature) as min_temp,
count(*) as record_count
from t
where date(timestamp) = today() - 1
group by device_id, date(timestamp)
loadTable("dfs://iot_platform", "daily_stats").append!(stats)
}
// 每日统计
scheduleJob("daily_stats", "每日统计", calcDailyStats,
00:30, 2024.01.01, 2030.12.31, 'D')
print("工业物联网数据平台创建完成")
九、总结
本文详细介绍了DolphinDB分布式表的创建与管理:
- 分布式表原理:分布式存储、水平扩展、高可用
- 创建方法:创建数据库、创建表、维度表
- 数据写入:批量写入、并行写入、流式写入
- 数据查询:基本查询、分区裁剪、分布式计算
- 表管理:查看信息、更新删除、分区管理
- 副本管理:副本配置、副本状态
思考题:
- 分布式表和内存表有什么区别?
- 如何设计高效的分区策略?
- 如何优化分布式表查询性能?