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

参考资料

相关推荐
麦聪聊数据8 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_8 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡8 小时前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧9 小时前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon9 小时前
SQL学习指南——视图
数据库·sql
活宝小娜9 小时前
mysql详细安装教程
数据库·mysql·adb
贤时间9 小时前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心9 小时前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
Database_Cool_10 小时前
即席查询(Ad-Hoc)数据库选型:AnalyticDB MySQL 秒级 Ad-Hoc 分析方案
数据库·mysql