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

参考资料

相关推荐
何中应1 小时前
Redis集群搭建
数据库·redis·缓存
KmSH8umpK2 小时前
Redis分布式锁进阶第十七篇
数据库·redis·分布式
fengxin_rou2 小时前
JVM 内存结构与内存溢出 / 泄漏问题全解析
java·开发语言·jvm·分布式·rabbitmq
重生之小比特2 小时前
【MySQL 数据库】表的操作
数据库·mysql
雷工笔记3 小时前
MES 系统 设备保养管理模块详细设计方案
运维·数据库
晚风_END5 小时前
Linux|操作系统|zfs文件系统的使用详解
linux·运维·服务器·数据库·postgresql·性能优化·宽度优先
晚风_END11 小时前
Linux|操作系统|最新版openzfs编译记录
linux·运维·服务器·数据库·spring·中间件·个人开发
dLYG DUMS12 小时前
DBeaver连接本地MySQL、创建数据库表的基础操作
数据库·mysql
苍煜12 小时前
MySQL分库分表和ES到底怎么选?
数据库·mysql·elasticsearch