DolphinDB分布式表:创建与管理

目录

    • 摘要
    • 一、分布式表概述
      • [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分布式表的创建与管理:

  1. 分布式表原理:分布式存储、水平扩展、高可用
  2. 创建方法:创建数据库、创建表、维度表
  3. 数据写入:批量写入、并行写入、流式写入
  4. 数据查询:基本查询、分区裁剪、分布式计算
  5. 表管理:查看信息、更新删除、分区管理
  6. 副本管理:副本配置、副本状态

思考题:

  1. 分布式表和内存表有什么区别?
  2. 如何设计高效的分区策略?
  3. 如何优化分布式表查询性能?

参考资料

相关推荐
PaperData12 小时前
1985-2025年全国区县专利申请与授权面板数据
数据库
snpgroupcn12 小时前
大数据量SAP迁移方案:系统越大,越不能硬搬
数据库·sap
Flynt13 小时前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
笃行35013 小时前
KingbaseES 数据加密全解:从 SSL 到全密态
数据库
Ivanqhz14 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
java1234_小锋15 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据类型简介
数据库·mysql
知行EDI15 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
成旭先生15 小时前
【2026】企业信息模糊查询 API 实战:名称、注册号、统一社会信用代码、企业类型与法人一次查全
服务器·数据库·数据服务
JosieBook15 小时前
【数据库】MySQL 实战精通系列 · 第10篇:分库分表与分布式事务实战
数据库·分布式·mysql
我叫洋洋16 小时前
Cadence CIS 元器件库合并实战:3000+ 焊盘、156 个符号零冲突并入自有库
数据库·单片机·嵌入式硬件·oracle·电路