DolphinDB数据导入导出:CSV、JSON、Parquet

目录

摘要

本文系统介绍DolphinDB数据导入导出功能。从CSV文件到JSON数据,从Parquet格式到数据库同步,全面讲解各类数据格式的导入导出方法。通过丰富的代码示例,帮助读者掌握高效的数据交换技能。


一、数据导入导出概述

1.1 支持的数据格式

数据格式
文本格式
CSV
JSON
TXT
二进制格式
Parquet
ORC
HDF5
数据库
MySQL
PostgreSQL
SQL Server

1.2 导入导出函数

函数 说明
loadText 导入文本文件
saveText 导出文本文件
loadTextEx 导入到分布式表
saveTextEx 从分布式表导出
loadParquet 导入Parquet
saveParquet 导出Parquet
loadJSON 导入JSON
saveJSON 导出JSON

二、CSV文件操作

2.1 导入CSV

python 复制代码
// 基本导入
t = loadText("/data/sensor_data.csv")

// 指定分隔符
t = loadText("/data/sensor_data.csv", delimiter=',')

// 指定表结构
schema = table(
    `device_id`timestamp`temperature`humidity as colNames,
    [INT, DATETIME, DOUBLE, DOUBLE] as colTypes
)
t = loadText("/data/sensor_data.csv", schema=schema)

// 跳过标题行
t = loadText("/data/sensor_data.csv", skipRows=1)

// 指定日期格式
t = loadText("/data/sensor_data.csv", dateFormat="yyyy-MM-dd HH:mm:ss")

2.2 导出CSV

python 复制代码
// 创建测试数据
t = table(
    1..100 as device_id,
    2024.01.01 + 0..99 as date,
    rand(20.0..30.0, 100) as temperature,
    rand(40.0..60.0, 100) as humidity
)

// 导出CSV
saveText(t, "/output/sensor_data.csv")

// 指定分隔符
saveText(t, "/output/sensor_data.csv", delimiter=',')

// 追加模式
saveText(t, "/output/sensor_data.csv", mode='a')

// 不包含列名
saveText(t, "/output/sensor_data.csv", header=false)

2.3 大文件导入

python 复制代码
// 分批导入大文件
def importLargeCSV(filePath, batchSize=100000) {
    result = table(1:0, `device_id`timestamp`temperature`humidity,
                   [INT, TIMESTAMP, DOUBLE, DOUBLE])
    
    // 使用ploadText并行加载
    data = ploadText(filePath)
    result.append!(data)
    
    return result
}

// 导入到分布式表
db = database("dfs://iot_data", VALUE, 2024.01.01..2024.12.31)
loadTextEx(db, "sensor_data", "/data/sensor_data.csv", `timestamp)

2.4 CSV导入实战

python 复制代码
// 完整的CSV导入流程
def importSensorData(csvPath, dbPath) {
    // 1. 定义表结构
    schema = table(
        `device_id`timestamp`temperature`humidity`pressure`status as colNames,
        [INT, DATETIME, DOUBLE, DOUBLE, DOUBLE, SYMBOL] as colTypes
    )
    
    // 2. 导入数据
    t = loadText(csvPath, schema=schema, dateFormat="yyyy-MM-dd HH:mm:ss")
    
    // 3. 数据清洗
    t = select * from t 
        where temperature between -40 and 100
        and humidity between 0 and 100
    
    // 4. 写入分布式表
    db = database(dbPath)
    loadTable(db, "sensor_data").append!(t)
    
    return t.rows()
}

// 执行导入
importSensorData("/data/sensors.csv", "dfs://iot_data")

三、JSON文件操作

3.1 导入JSON

python 复制代码
// 导入JSON文件
t = loadJSON("/data/sensor_data.json")

// 解析JSON字符串
jsonStr = '{"device_id":1,"temperature":25.5,"humidity":50.0}'
data = parseJson(jsonStr)

// 解析JSON数组
jsonArr = '[{"id":1,"value":10},{"id":2,"value":20}]'
t = parseJson(jsonArr)

3.2 导出JSON

python 复制代码
// 创建测试数据
t = table(
    1..5 as device_id,
    `A`B`C`D`E as name,
    10.0 20.0 30.0 40.0 50.0 as value
)

// 导出JSON
saveJSON(t, "/output/sensor_data.json")

// 格式化输出
saveJSON(t, "/output/sensor_data_pretty.json", pretty=true)

3.3 嵌套JSON处理

python 复制代码
// 处理嵌套JSON
nestedJson = '{
    "device": {
        "id": 1,
        "name": "sensor_001"
    },
    "data": {
        "temperature": 25.5,
        "humidity": 50.0
    }
}'

// 解析嵌套结构
data = parseJson(nestedJson)
device_id = data.device.id
temperature = data.data.temperature

四、Parquet文件操作

4.1 导入Parquet

python 复制代码
// 导入Parquet文件
t = loadParquet("/data/sensor_data.parquet")

// 指定列
t = loadParquet("/data/sensor_data.parquet", 
                columns=`device_id`timestamp`temperature)

// 导入到分布式表
db = database("dfs://iot_data", VALUE, 2024.01.01..2024.12.31)
loadParquetEx(db, "sensor_data", "/data/sensor_data.parquet", `timestamp)

4.2 导出Parquet

python 复制代码
// 创建测试数据
t = table(
    1..10000 as device_id,
    take(2024.01.01..2024.01.10, 10000) as date,
    rand(20.0..30.0, 10000) as temperature,
    rand(40.0..60.0, 10000) as humidity
)

// 导出Parquet
saveParquet(t, "/output/sensor_data.parquet")

// 指定压缩
saveParquet(t, "/output/sensor_data.parquet", compression="snappy")

4.3 Parquet优势

特性 说明
列式存储 高效压缩、快速查询
压缩率高 比CSV小5-10倍
读取快 只读取需要的列
跨平台 Spark、Hive等支持

五、数据库同步

5.1 MySQL同步

python 复制代码
// 加载MySQL插件
loadPlugin("/plugins/mysql/libPluginMySQL.so")

// 连接MySQL
conn = mysql::connect("localhost", 3306, "root", "password", "iot_db")

// 导入MySQL表
t = mysql::loadTable(conn, "sensor_data")

// 导入查询结果
t = mysql::query(conn, "SELECT * FROM sensor_data WHERE date >= '2024-01-01'")

// 写入MySQL
mysql::saveTable(conn, t, "sensor_data_backup")

5.2 PostgreSQL同步

python 复制代码
// 加载PostgreSQL插件
loadPlugin("/plugins/odbc/libPluginODBC.so")

// 连接PostgreSQL
conn = odbc::connect("Driver={PostgreSQL};Server=localhost;Port=5432;Database=iot_db;", 
                     "postgres", "password")

// 导入数据
t = odbc::query(conn, "SELECT * FROM sensor_data")

// 写入数据
odbc::execute(conn, "INSERT INTO sensor_data VALUES (1, '2024-01-15', 25.5, 50.0)")

六、批量导入导出

6.1 批量导入

python 复制代码
// 批量导入目录下所有CSV
def batchImportCSV(dirPath, dbPath, tableName) {
    files = dir(dirPath, "*.csv")
    db = database(dbPath)
    
    for (file in files) {
        print("导入: " + file)
        t = loadText(dirPath + "/" + file)
        loadTable(db, tableName).append!(t)
    }
    
    return size(files)
}

// 执行批量导入
batchImportCSV("/data/sensors/", "dfs://iot_data", "sensor_data")

6.2 定时同步

python 复制代码
// 定时同步任务
def syncData() {
    // 从源数据库同步
    source = mysql::loadTable(mysql_conn, "sensor_data")
    
    // 写入DolphinDB
    loadTable("dfs://iot_data", "sensor_data").append!(source)
    
    print("同步完成: " + now())
}

// 每小时同步
scheduleJob("sync_sensor", "传感器数据同步", syncData,
            00:00, 2024.01.01, 2030.12.31, 'H')

七、数据格式转换

7.1 格式转换

python 复制代码
// CSV转Parquet
def csvToParquet(csvPath, parquetPath) {
    t = loadText(csvPath)
    saveParquet(t, parquetPath)
}

// Parquet转CSV
def parquetToCSV(parquetPath, csvPath) {
    t = loadParquet(parquetPath)
    saveText(t, csvPath)
}

// JSON转Parquet
def jsonToParquet(jsonPath, parquetPath) {
    t = loadJSON(jsonPath)
    saveParquet(t, parquetPath)
}

7.2 数据清洗

python 复制代码
// 导入时清洗数据
def importAndClean(filePath) {
    // 导入
    t = loadText(filePath)
    
    // 清洗
    t = select * from t
          where temperature is not null
          and temperature between -40 and 100
          and humidity between 0 and 100
    
    // 转换
    t[`timestamp] = temporalParse(t.timestamp, "yyyy-MM-dd HH:mm:ss")
    
    return t
}

八、性能优化

8.1 导入优化

优化项 说明
批量导入 减少IO次数
并行导入 ploadText并行加载
预分配 设置初始容量
分区导入 loadTextEx直接导入分区

8.2 导出优化

优化项 说明
列裁剪 只导出需要的列
压缩存储 Parquet压缩
分区导出 按分区导出

8.3 性能对比

格式 导入速度 导出速度 存储空间
CSV
JSON
Parquet

九、总结

本文系统介绍了DolphinDB数据导入导出:

  1. CSV操作:导入、导出、大文件处理
  2. JSON操作:导入、导出、嵌套处理
  3. Parquet操作:导入、导出、优势分析
  4. 数据库同步:MySQL、PostgreSQL
  5. 批量处理:批量导入、定时同步
  6. 格式转换:CSV/JSON/Parquet互转
  7. 性能优化:导入导出优化

思考题

  1. 如何选择合适的数据格式?
  2. 大文件导入如何优化?
  3. 如何实现增量数据同步?

参考资料

相关推荐
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
调试优选官2 天前
IoT物联网系统定制落地实践:从设备接入、协议网关、平台分层到业务应用,如何做技术选型、交付验收、责任边界与长期运维成本评估及迁移安排
物联网·iot·成本分析
A黄俊辉A2 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
华允物联-HUAIOT2 天前
工业路由器和DTU在联网方式上的区别
物联网
wuyk5552 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
绿蕉2 天前
配电房的“AI听诊师”:可视化声纹局放智能巡检系统与通讯保障
物联网
伞伞悦读2 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
chshang19922 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
做萤石二次开发的哈哈2 天前
海康商用音频主机接入萤石蓝海 AIoT:多路拾音、矩阵路由、分区广播、应急广播四类技能,IP 网络广播系统多端开发实战
物联网·音频矩阵·萤石开放平台·ip网络广播·蓝海aiot一站式工作台·aiot开发·公共广播