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. 如何优化分布式表查询性能?

参考资料

相关推荐
城管不管6 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
倔强的石头1066 小时前
向量数据库从相似度检索走向融合数据底座
数据库
今天AI了吗8 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
lilian2339 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
皮卡丘不断更9 小时前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
保卫大狮兄10 小时前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备
国科安芯10 小时前
ASL706S:让 MCU 不再“失忆跑飞“的守护芯片
分布式·单片机·嵌入式硬件·安全·fpga开发·架构
数据安全技术观察11 小时前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
小席是个热心肠11 小时前
Redis的自我学习
数据库·redis·学习
2601_9657984712 小时前
Salient Theme Setup Guide for Fast Creative WordPress Sites
数据库·web3·php·wordpress