前言

DolphinDB 是由浙江智臾科技有限公司研制的一款高性能分布式时序数据库,集成了功用强壮的编程言语和高容量高速度的流数据剖析体系,为海量结构化数据的快速存储、检索、剖析及核算供给一站式处理方案。DolphinDB 数据库支持每秒百万级数据写入,万亿级别数据毫秒级查询呼应,以及高压缩比的数据存储,适用于工业物联网及量化金融等领域

为了进一步简化 DolphinDB 的运用办法,咱们在 Node-RED 上构建了一个 DolphinDB 低代码渠道。经过可视化编程工具,咱们将 DolphinDB 的功用笼统成易于了解的节点,使操作流程愈加清晰明晰。这种可视化办法不只提高了用户运用渠道的快捷性,还大大降低了用户的学习门槛。即便用户不了解 DolphinDB 的编程言语,也能轻松完结各种操作。

使用 Node-RED 构建 DolphinDB 低代码平台

在咱们的低代码渠道上,用户只需运用简略的拖拉拽操作,便能完结无形式写入、数据清洗、降采样、设备监控、反常监测等功用,然后让数据处理变得愈加快捷高效。

以下内容将详细介绍 Node-RED 渠道的特色、DolphinDB 低代码渠道的状况,以及开发 DolphinDB 节点的办法。

关于 Node-RED

Node-RED 是一个开源的可视化编程工具,它让衔接、编排和主动化物联网设备、API 和在线服务变得十分简略。它运用户可以经过简略地拖拽和衔接节点来创立应用程序,其间每个节点代表一个特定的功用或服务。你可以把它想象成一个拼图游戏,经过拖拽和衔接不同的拼图,就可以创立出各种应用程序。

举个比如,人们会期望在回家的路上就能敞开空调,到家即享清凉。凭借 Node-RED 可以轻松完结这个需求。经过简略地拖拽微信节点、音讯处理节点和空调控制节点,然后衔接设置它们,就能完结这个流程。这样,只需在微信上发送一条音讯,就能控制家中空调的开关。

使用 Node-RED 构建 DolphinDB 低代码平台

使用 Node-RED 构建 DolphinDB 低代码平台

Node-RED 是依据Node.js构建的,因而具有轻量化和高效的特色。它充分运用了 Node.js 的事情驱动和非堵塞模型,在网络边缘的低成本硬件(如 Raspberry Pi)和云中表现出色。这使得 Node-RED 成为一个十分适用于各种场景的工具。

Node-RED 的节点扩展库中包括了许多内置节点和功用,例如数据库拜访、Web 服务和电子邮件告诉,这些功用大大简化了开发进程。它供给了强壮的功用组件,让用户可以快速搭建杂乱的物联网设备、API 和在线服务,无需编写繁琐的代码。

此外,Node-RED 运用 JSON 格局来存储流程,这使得同享和导入导出变得十分方便。用户可以轻松地与其别人分享自己的流程,并从社区中获取更多的处理方案和创意。这种开放性和合作性为用户供给了更多的可能性和灵活性。

总的来说,Node-RED 是一个强壮且易于运用的工具,供给了一个可视化编程环境,运用户可以轻松地衔接、编排和主动化物联网设备、API 和在线服务。无论在物联网、主动化还是数据流处理领域,Node-RED 都是一个十分有用和受欢迎的工具,为用户带来了极大的便利和效率。

DolphinDB 低代码渠道

渠道介绍

DolphinDB 低代码渠道是一个依据 Node-RED 的 DolphinDB 功用可视化渠道。具有强壮的可扩展性,为用户供给了开发自界说功用节点的可能性。用户可以依据本身需求开发合适自己业务场景的功用节点,然后进一步增强渠道的功用和适应性。

使用 Node-RED 构建 DolphinDB 低代码平台

在事例介绍章节中,咱们将介绍 DolphinDB 节点的开发办法,协助用户更好地运用该低代码渠道,完结更多个性化需求。

本文所供给的 DolphinDB 低代码渠道事例供给了十余个节点,划分为文件操作、数据清洗和 DolphinDB 功用节点三个类别。文件操作类别供给了数据加载节点,方便用户将本地文件加载到 DolphinDB 的内存表中。数据清洗类别则供给了格局转化、NULL 填充、数据去重和数据归一化等功用节点,协助用户完结各种数据清洗操作。而在DolphinDB 功用节点类别中,供给了数据入库、降采样、无形式写入、流表创立和流数据引擎等功用节点,运用户可以轻松运用 DolphinDB 的功用,而无需把握其编程言语。

使用 Node-RED 构建 DolphinDB 低代码平台

运用说明

DolphinDB 低代码渠道是依据 Node-RED 构建的,所以需先装置 Node-RED, Node-RED 的官方装置教程可参考:Getting Started : Node-RED。在完结 Node-RED 的装置之后,可按以下进程装置 DolphinDB 节点。

  1. 下载 DolphinDB 节点。下载附件中的 DolphinDB 节点node-red-contrib-dolphindb-main装置包。例如在下例中,下载并解压至D:\Node_Red_Project文件夹下,文件里的内容如下:

使用 Node-RED 构建 DolphinDB 低代码平台

  1. 将 DolphinDB 节点装置到 Node-RED 中。进入到 .node-red目录(此目录应该在C:\Users<用户名> 目录下面),然后用 npm 装置node-red-contrib-dolphindb-main。详细指令如下,

其间D:\Node_Red_Project\node-red-contrib-dolphindb-main是 DolphinDB 节点装置包的下载途径。

cd C:\Users<用户名>.node-red
npm install D:\Node_Red_Project\node-red-contrib-dolphindb-main

装置成功后会呈现以下内容。

使用 Node-RED 构建 DolphinDB 低代码平台

  1. 运用 DolphinDB 节点。在 cmd 中输入指令node-red以敞开 Node-RED 服务。呈现以下内容表明 Node-RED 服务启动成功。

使用 Node-RED 构建 DolphinDB 低代码平台

  1. 打开网页http://localhost:1880在左边选项板中会呈现 DolphinDB 节点,拖出来运用即可。

使用 Node-RED 构建 DolphinDB 低代码平台

DolphinDB 低代码渠道

事例介绍

数据处理流程

在本文的 DolphinDB 低代码渠道事例中,用户可以轻松地以拖拽的办法完结数据清洗流程。下文将介绍如何加载 CSV 文件中的数据,对其进行数据清洗,最终将清洗后的数据存入 DolphinDB 数据库。

首要,咱们有以下 CSV 文件中的数据:

id date price qty tmp
1 2018.01.02 70.832104 1719 1.2
1 2018.01.03 12.22557 3.2
3 2018.01.04 8.695886 1656 0.4
4 2018.01.05 24.324535 2860 2
5 2018.01.06 0.443173 6874 3.8
6 2018.01.07 90.302176 3277 -1.8
7 2018.01.08 78.556843 3424 -0.6
8 2018.01.09 45.836447 8636 0.4
9 2018.01.10 57.416425 707 1.6
10 2018.01.11 98.879764 2267 4.2

数据清洗的详细操作进程如下:

  1. 将 CSV 文件中的数据加载到 DolphinDB 内存表中。
  2. 去除 id 列的重复值,确保每个id的数据是唯一的。
  3. 对 price 列进行格局转化,将数据统一为两位小数。
  4. 对 qty 列的 NULL 值,运用平均值进行填充,确保数据完整性。
  5. 对 tmp 列进行 Max-Min 归一化,将数据缩放到0到1的规模。
  6. 将清洗之后的数据存入 DolphinDB 数据库,以便后续的数据剖析和应用。

以下为在 DolphinDB 低代码渠道上完结上诉数据处理操作的进程。

  • 将 inject,加载文件,格局转化,null 填充,去重,数据归一化和数据入库节点拖拽到作业区中
  • 依照数据清洗的逻辑次序将节点衔接起来。

使用 Node-RED 构建 DolphinDB 低代码平台

  • 点击节点,对节点进行相应的参数装备。

使用 Node-RED 构建 DolphinDB 低代码平台

使用 Node-RED 构建 DolphinDB 低代码平台

  • 点击作业区右上角的部署按钮。
  • 点击时间戳节点,触发流程启动。随后可在 DolphinDB 数据库中检查经过清洗之后的数据。

使用 Node-RED 构建 DolphinDB 低代码平台

无形式写入

无形式写入是一种数据库写入办法,特别适用于物联网场景的设备收集数据。在传统的联系型数据库中,数据写入需求事先界说好数据表的结构,包括字段称号、数据类型和束缚等信息。但是,在现实世界中,很多数据并不合适严格的表结构,例如收集频率不同的各类传感器数据等。

无形式写入处理了这个问题,它答应将数据直接写入数据库中,无需提早界说表结构。数据可以依照其原始格局灵活存储,无需额定的数据转化和处理,然后大大简化了数据写入的进程。

在 DolphinDB 低代码渠道上,完结无形式写入的流程可以经过两个节点轻松完结。以下为完结无形式写入的详细进程:

  • 将 Mqtt In 节点和 无形式写入 节点拖拽到作业区
  • 将两个节点衔接起来
  • 点击节点,进行参数设置。在 Mqtt In 节点中设置服务端和音讯主题,在无形式写入节点中设置数据库称号。

使用 Node-RED 构建 DolphinDB 低代码平台

使用 Node-RED 构建 DolphinDB 低代码平台

  • 点击部署按钮。

使用 Node-RED 构建 DolphinDB 低代码平台

之后就可以向 mqtt 发音讯,完结无形式写入。无形式写入中,在向 mqtt 发音讯时,需求依照一定的格局要求,发送音讯。这儿发送多条相似以下内容的音讯给 mqtt。

{
  "tags":{
      "deviceCode": "361RP01",
      "logicalPositionId": "1",
      "physicalPositionId": "AI361RP01T"
  },
  "fields":{
      "propertyValue":1505
  },
  "time": "2023-07-22 15:53:08"
}

假如运转成功,DolphinDB 中将呈现名为 “Mqtt_DDB” 的数据库,而且数据库会不断接纳来自 “Mqtt” 的音讯。

使用 Node-RED 构建 DolphinDB 低代码平台

DolphinDB 节点开发办法

DolphinDB 节点是依据 Node-RED 的,因而开发 DolphinDB 节点需求先把握 Node-RED 节点开发的基础知识。可参照:Node-RED 节点开发教程。

DolphinDB 的装置包中包括核心文件dolphindb.htmldolphindb.js。其间,dolphindb.html首要用于界说DolphinDB 节点的属性、编辑对话框和协助文本,而 dolphindb.js 则首要用于界说 DolphinDB 节点的功用。

在 DolphinDB 节点的 html 文件部分与一般 Node-RED 节点开发流程相似,因而这儿不再赘述。咱们要点介绍dolphindb.js中的节点功用完结办法,可参照:JavaScript API进行开发。

在 JavaScript 中衔接 DolphinDB

  • 在 JavaScript 中导入 DolphinDB,并设置衔接装备,树立与 DolphinDB 的衔接。
import { DDB } from 'dolphindb'
// 运用 WebSocket URL 初始化衔接到 DolphinDB 的实例(不树立实际的网络衔接)
let ddb = new DDB('ws://127.0.0.1:8848', {
    // 是否在树立衔接后主动登录,默许 `true`
    autologin: true,
    // DolphinDB 登录用户名,默许 `'admin'`
    username: 'admin',
    // DolphinDB 登录暗码,默许 `'123456'`
    password: '123456',
    // 设置 python session flag,默许 `false`
    python: false,
    // 设置该选项后,该数据库衔接只用于流数据
    streaming: undefined
})
// 树立到 DolphinDB 的衔接
await ddb.connect()
  • 树立装备节点,衔接到 DolphinDB
function DolphinConfigNode(n) {
        RED.nodes.createNode(this, n);
        this.url = n.url
        this.name = n.name
        this.client = new DDB(this.url, {
            autologin: true,
            username: this.credentials.username,
            password: this.credentials.password,
            python: false,
            streaming: undefined
        })
    }
    RED.nodes.registerType("dolphindb", DolphinConfigNode, {
        credentials: {
            username: { type: "text" },
            password: { type: "password" }
        }
    });
  • DolphinDB 节点结构:

a. 节点结构函数。节点由结构函数界说,该函数可用于创立节点的新实例。该函数传递一个包括流编辑器中设置的属性的对象。它有必要做的第一件事是调用该RED.nodes.createNode函数来初始化一切节点同享的特征,然后就可以履行特定于节点的代码。

  //结构函数
  function DolphinDBNode(config) {
      RED.nodes.createNode(this,config);
      // 获取 DolphinDB 装备结点
      this.dolphindb = n.dolphindb;
      this.dolphindbConfig = RED.nodes.getNode(this.dolphindb);
      var client = this.dolphindbConfig.client;
      //功用句子
  }
  //注册节点
  RED.nodes.registerType("DolphinDB",DolphinDBNode);

b. 接纳音讯。节点注册该事情的侦听器input,以接纳来自流中上游节点的音讯。一旦收到音讯,就履行相应的功用。

this.on('input', function(msg, send, done) {
    //履行功用
});
  • 函数句子。在 JavaScript 中,咱们运用eval()函数来履行 DolphinDB 脚本。一般来说,咱们将 DolphinDB 脚本分为函数func和函数调用funcall两个部分,然后将它们拼接在一起,并调用eval()函数来履行 DolphinDB 脚本。
var func=`def foo(a,b){
               return a+b;
          }`
var funcall=`foo(11,11)`
var secipt=func+funcall
const result = await ddb.eval(script)

事例

最终,咱们以数据归一化节点为例,来介绍 DolphinDB 节点的功用完结代码。

//结构函数
function DolphinDataNormalizationNode(n) {
        RED.nodes.createNode(this, n);
        // 获取 DolphinDB 装备结点
        this.dolphindb = n.dolphindb;
        this.dolphindbConfig = RED.nodes.getNode(this.dolphindb);
        if (!this.dolphindbConfig) { //检查是否成功获取了 DolphinDB 装备节点
            this.error(RED._("dolphindb.errors.missingconfig"));
            return;
        }
        var client = this.dolphindbConfig.client;
        //将当前节点的上下文保存在变量 node 中
        this.name=n.name;
        this.tableName=n.tableName;
        this.colName=n.colName;
        this.normalizeType=n.normalizeType;
        var node = this;
        //DolphinDB 脚本
        var func=`def minMaxNormalization(tableName,colName){
                      pt=objByName(tableName);
                      minNum=min(pt[colName]);
                      maxNum=max(pt[colName]);
                      pt[colName]=(pt[colName]-minNum)/(maxNum-minNum);
                  }
                  def ZSoreNormalization(tableName,colName){
                      pt=objByName(tableName);
                      meanNum=mean(pt[colName]);
                      stdNum=std(pt[colName]);
                      pt[colName]=(pt[colName]-meanNum)/stdNum;
                  }
                  def dataNormalization(tableName,colName,type){
                      if(type==1){
                          minMaxNormalization(tableName,colName);
                      }else if(type==2){
                          ZSoreNormalization(tableName,colName);
                      }
                  }`;
        var funcall =`dataNormalization("${this.tableName}",`${this.colName},${this.normalizeType})`;
        var script =func+funcall;
        console.log(script) //打印生成的 DolphinDB 脚本,用于调试和检查。
        //注册监听器 input,一旦收到音讯,则履行 DolphinDB 脚本
        node.on('input', async function (msg, send, done) {
            client.eval(script).then(res => {
                send(msg)
                done()
            }).catch(err => {
                console.log(err)
                done(err)
            })
        });
    }
//注册节点
RED.nodes.registerType("数据归一化", DolphinDataNormalizationNode);

总结

本文介绍了 Node-RED 渠道,Node-RED 以其简略的拖拽和衔接节点的办法,让用户可以轻松创立各种应用程序,无需编写繁琐的代码。

DolphinDB 低代码渠道的构建依据Node-RED。经过可视化编程办法将 DolphinDB 功用可视化为节点,使操作流程清晰明晰。其间,数据清洗和无形式写入事例,展现了 DolphinDB 低代码渠道的简便性和高效性。

更重要的是,DolphinDB 低代码渠道具有很强的可扩展性。用户可以依据本身需求开发自界说功用节点,进一步增强渠道的功用和适应性。这种开放性为用户供给了更多可能性和灵活性,使他们可以在渠道上完结更多个性化需求。

经过 Node-RED 渠道和 DolphinDB 低代码渠道,用户可以轻松构建杂乱的物联网设备、API 和在线服务,完结数据处理和存储,加速立异和数字化转型的进程。

附件

  • DolphinDB 节点装置包