使用 Node-RED 構(gòu)建 DolphinDB 低代碼平臺(tái)
前言
DolphinDB 是由浙江智臾科技有限公司研發(fā)的一款高性能分布式時(shí)序數(shù)據(jù)庫,集成了功能強(qiáng)大的編程語言和高容量高速度的流數(shù)據(jù)分析系統(tǒng),為海量結(jié)構(gòu)化數(shù)據(jù)的快速存儲(chǔ)、檢索、分析及計(jì)算提供一站式解決方案。DolphinDB 數(shù)據(jù)庫支持每秒百萬級(jí)數(shù)據(jù)寫入,萬億級(jí)別數(shù)據(jù)毫秒級(jí)查詢響應(yīng),以及高壓縮比的數(shù)據(jù)存儲(chǔ),適用于工業(yè)物聯(lián)網(wǎng)及量化金融等領(lǐng)域。
為了進(jìn)一步簡化 DolphinDB 的使用方式,我們?cè)?Node-RED 上構(gòu)建了一個(gè) DolphinDB 低代碼平臺(tái)。通過可視化編程工具,我們將 DolphinDB 的功能抽象成易于理解的節(jié)點(diǎn),使操作流程更加清晰明了。這種可視化方式不僅提高了用戶使用平臺(tái)的便捷性,還大大降低了用戶的學(xué)習(xí)門檻。即使用戶不了解 DolphinDB 的編程語言,也能輕松完成各種操作。
在我們的低代碼平臺(tái)上,用戶只需使用簡單的拖拉拽操作,便能實(shí)現(xiàn)無模式寫入、數(shù)據(jù)清洗、降采樣、設(shè)備監(jiān)控、異常監(jiān)測等功能,從而讓數(shù)據(jù)處理變得更加便捷高效。
以下內(nèi)容將詳細(xì)介紹 node-RED 平臺(tái)的特點(diǎn)、DolphinDB 低代碼平臺(tái)的情況,以及開發(fā) DolphinDB 節(jié)點(diǎn)的方法。
關(guān)于 Node-RED
Node-RED 是一個(gè)開源的可視化編程工具,它讓連接、編排和自動(dòng)化物聯(lián)網(wǎng)設(shè)備、API 和在線服務(wù)變得非常簡單。它使用戶能夠通過簡單地拖拽和連接節(jié)點(diǎn)來創(chuàng)建應(yīng)用程序,其中每個(gè)節(jié)點(diǎn)代表一個(gè)特定的功能或服務(wù)。你可以把它想象成一個(gè)拼圖游戲,通過拖拽和連接不同的拼圖,就可以創(chuàng)建出各種應(yīng)用程序。
舉個(gè)例子,人們會(huì)希望在回家的路上就能開啟空調(diào),到家即享清涼。借助 Node-RED 可以輕松實(shí)現(xiàn)這個(gè)需求。通過簡單地拖拽微信節(jié)點(diǎn)、消息處理節(jié)點(diǎn)和空調(diào)控制節(jié)點(diǎn),然后連接設(shè)置它們,就能實(shí)現(xiàn)這個(gè)流程。這樣,只需在微信上發(fā)送一條消息,就能控制家中空調(diào)的開關(guān)。
Node-RED 是基于Node.js構(gòu)建的,因此具有輕量化和高效的特點(diǎn)。它充分利用了 Node.js 的事件驅(qū)動(dòng)和非阻塞模型,在網(wǎng)絡(luò)邊緣的低成本硬件(如 Raspberry Pi)和云中表現(xiàn)出色。這使得 Node-RED 成為一個(gè)非常適用于各種場景的工具。
Node-RED 的節(jié)點(diǎn)擴(kuò)展庫中包含了許多內(nèi)置節(jié)點(diǎn)和功能,例如數(shù)據(jù)庫訪問、Web 服務(wù)和電子郵件通知,這些功能大大簡化了開發(fā)過程。它提供了強(qiáng)大的功能組件,讓用戶能夠快速搭建復(fù)雜的物聯(lián)網(wǎng)設(shè)備、API 和在線服務(wù),無需編寫繁瑣的代碼。
此外,Node-RED 使用 JSON 格式來存儲(chǔ)流程,這使得共享和導(dǎo)入導(dǎo)出變得非常方便。用戶可以輕松地與其他人分享自己的流程,并從社區(qū)中獲取更多的解決方案和靈感。這種開放性和合作性為用戶提供了更多的可能性和靈活性。
總的來說,Node-RED 是一個(gè)強(qiáng)大且易于使用的工具,提供了一個(gè)可視化編程環(huán)境,使用戶能夠輕松地連接、編排和自動(dòng)化物聯(lián)網(wǎng)設(shè)備、API 和在線服務(wù)。無論在物聯(lián)網(wǎng)、自動(dòng)化還是數(shù)據(jù)流處理領(lǐng)域,Node-RED 都是一個(gè)非常實(shí)用和受歡迎的工具,為用戶帶來了極大的便利和效率。
DolphinDB 低代碼平臺(tái)
平臺(tái)介紹
DolphinDB 低代碼平臺(tái)是一個(gè)基于 Node-RED 的 DolphinDB 功能可視化平臺(tái)。具有強(qiáng)大的可擴(kuò)展性,為用戶提供了開發(fā)自定義功能節(jié)點(diǎn)的可能性。用戶可以根據(jù)自身需求開發(fā)適合自己業(yè)務(wù)場景的功能節(jié)點(diǎn),從而進(jìn)一步增強(qiáng)平臺(tái)的功能和適應(yīng)性。
在案例介紹章節(jié)中,我們將介紹 DolphinDB 節(jié)點(diǎn)的開發(fā)方法,幫助用戶更好地利用該低代碼平臺(tái),實(shí)現(xiàn)更多個(gè)性化需求。
本文所提供的 DolphinDB 低代碼平臺(tái)案例提供了十余個(gè)節(jié)點(diǎn),劃分為文件操作、數(shù)據(jù)清洗和 DolphinDB 功能節(jié)點(diǎn)三個(gè)類別。文件操作類別提供了數(shù)據(jù)加載節(jié)點(diǎn),方便用戶將本地文件加載到 DolphinDB 的內(nèi)存表中。數(shù)據(jù)清洗類別則提供了格式轉(zhuǎn)換、NULL 填充、數(shù)據(jù)去重和數(shù)據(jù)歸一化等功能節(jié)點(diǎn),幫助用戶實(shí)現(xiàn)各種數(shù)據(jù)清洗操作。而在DolphinDB 功能節(jié)點(diǎn)類別中,提供了數(shù)據(jù)入庫、降采樣、無模式寫入、流表創(chuàng)建和流數(shù)據(jù)引擎等功能節(jié)點(diǎn),使用戶能夠輕松使用 DolphinDB 的功能,而無需掌握其編程語言。
使用說明
DolphinDB 低代碼平臺(tái)是基于 Node-RED 構(gòu)建的,所以需先安裝 Node-RED, Node-RED 的官方安裝教程可參考:Getting Started : Node-RED 。在完成 Node-RED 的安裝之后,可按以下步驟安裝 DolphinDB 節(jié)點(diǎn)。
1. 下載 DolphinDB 節(jié)點(diǎn)。下載附件中的 DolphinDB 節(jié)點(diǎn) node-red-contrib-dolphindb-main 安裝包。例如在下例中,下載并解壓至 D:Node_Red_Project 文件夾下,文件里的內(nèi)容如下:
2. 將 DolphinDB 節(jié)點(diǎn)安裝到 Node-RED 中。進(jìn)入到 .node-red 目錄(此目錄應(yīng)該在 C:Users<用戶名> 目錄下面),然后用 npm 安裝 node-red-contrib-dolphindb-main。具體指令如下,
其中 D:Node_Red_Projectnode-red-contrib-dolphindb-main 是 DolphinDB 節(jié)點(diǎn)安裝包的下載路徑。
cd C:Users<用戶名>.node-rednpm install D:Node_Red_Projectnode-red-contrib-dolphindb-main
安裝成功后會(huì)出現(xiàn)以下內(nèi)容。
3. 使用 DolphinDB 節(jié)點(diǎn)。在 cmd 中輸入指令 node-red 以開啟 Node-RED 服務(wù)。出現(xiàn)以下內(nèi)容表示 Node-RED 服務(wù)啟動(dòng)成功。
4. 打開網(wǎng)頁 http://localhost:1880 在左側(cè)選項(xiàng)板中會(huì)出現(xiàn) DolphinDB 節(jié)點(diǎn),拖出來使用即可。
DolphinDB 低代碼平臺(tái)
案例介紹
數(shù)據(jù)處理流程
在本文的 DolphinDB 低代碼平臺(tái)案例中,用戶可以輕松地以拖拽的方式實(shí)現(xiàn)數(shù)據(jù)清洗流程。下文將介紹如何加載 CSV 文件中的數(shù)據(jù),對(duì)其進(jìn)行數(shù)據(jù)清洗,最后將清洗后的數(shù)據(jù)存入 DolphinDB 數(shù)據(jù)庫。
首先,我們有以下 CSV 文件中的數(shù)據(jù):
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 |
數(shù)據(jù)清洗的具體操作過程如下:
- 將 CSV 文件中的數(shù)據(jù)加載到 DolphinDB 內(nèi)存表中。
- 去除 id 列的重復(fù)值,確保每個(gè)id的數(shù)據(jù)是唯一的。
- 對(duì) price 列進(jìn)行格式轉(zhuǎn)換,將數(shù)據(jù)統(tǒng)一為兩位小數(shù)。
- 對(duì) qty 列的 NULL 值,使用平均值進(jìn)行填充,確保數(shù)據(jù)完整性。
- 對(duì) tmp 列進(jìn)行 Max-Min 歸一化,將數(shù)據(jù)縮放到0到1的范圍。
- 將清洗之后的數(shù)據(jù)存入 DolphinDB 數(shù)據(jù)庫,以便后續(xù)的數(shù)據(jù)分析和應(yīng)用。
以下為在 DolphinDB 低代碼平臺(tái)上實(shí)現(xiàn)上訴數(shù)據(jù)處理操作的過程。
- 將 inject,加載文件,格式轉(zhuǎn)換,null 填充,去重,數(shù)據(jù)歸一化和數(shù)據(jù)入庫節(jié)點(diǎn)拖拽到工作區(qū)中
- 按照數(shù)據(jù)清洗的邏輯順序?qū)⒐?jié)點(diǎn)連接起來。
- 點(diǎn)擊節(jié)點(diǎn),對(duì)節(jié)點(diǎn)進(jìn)行相應(yīng)的參數(shù)配置。
- 點(diǎn)擊工作區(qū)右上角的 部署 按鈕。
- 點(diǎn)擊時(shí)間戳節(jié)點(diǎn),觸發(fā)流程啟動(dòng)。隨后可在 DolphinDB 數(shù)據(jù)庫中查看經(jīng)過清洗之后的數(shù)據(jù)。
無模式寫入
無模式寫入是一種數(shù)據(jù)庫寫入方式,特別適用于物聯(lián)網(wǎng)場景的設(shè)備采集數(shù)據(jù)。在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中,數(shù)據(jù)寫入需要事先定義好數(shù)據(jù)表的結(jié)構(gòu),包括字段名稱、數(shù)據(jù)類型和約束等信息。然而,在現(xiàn)實(shí)世界中,很多數(shù)據(jù)并不適合嚴(yán)格的表結(jié)構(gòu),例如采集頻率不同的各類傳感器數(shù)據(jù)等。
無模式寫入解決了這個(gè)問題,它允許將數(shù)據(jù)直接寫入數(shù)據(jù)庫中,無需提前定義表結(jié)構(gòu)。數(shù)據(jù)可以按照其原始格式靈活存儲(chǔ),無需額外的數(shù)據(jù)轉(zhuǎn)換和處理,從而大大簡化了數(shù)據(jù)寫入的過程。
在 DolphinDB 低代碼平臺(tái)上,實(shí)現(xiàn)無模式寫入的流程可以通過兩個(gè)節(jié)點(diǎn)輕松完成。以下為實(shí)現(xiàn)無模式寫入的具體過程:
- 將 Mqtt In 節(jié)點(diǎn)和 無模式寫入 節(jié)點(diǎn)拖拽到工作區(qū)
- 將兩個(gè)節(jié)點(diǎn)連接起來
- 點(diǎn)擊節(jié)點(diǎn),進(jìn)行參數(shù)設(shè)置。在 Mqtt In 節(jié)點(diǎn)中設(shè)置服務(wù)端和消息主題,在無模式寫入節(jié)點(diǎn)中設(shè)置數(shù)據(jù)庫名稱。
- 點(diǎn)擊部署按鈕。
之后就可以向 mqtt 發(fā)消息,實(shí)現(xiàn)無模式寫入。無模式寫入中,在向 mqtt 發(fā)消息時(shí),需要按照一定的格式要求,發(fā)送消息。這里發(fā)送多條類似以下內(nèi)容的消息給 mqtt。
{ "tags":{ "deviceCode": "361RP01", "logicalPositionId": "1", "physicalPositionId": "AI361RP01T" }, "fields":{ "propertyValue":1505 }, "time": "2023-07-22 15:53:08"}
如果運(yùn)行成功,DolphinDB 中將出現(xiàn)名為 "Mqtt_DDB" 的數(shù)據(jù)庫,并且數(shù)據(jù)庫會(huì)不斷接收來自 "Mqtt" 的消息。
DolphinDB 節(jié)點(diǎn)開發(fā)方法
DolphinDB 節(jié)點(diǎn)是基于 Node-RED 的,因此開發(fā) DolphinDB 節(jié)點(diǎn)需要先掌握 Node-RED 節(jié)點(diǎn)開發(fā)的基礎(chǔ)知識(shí)。可參照:Node-RED 節(jié)點(diǎn)開發(fā)教程。
DolphinDB 的安裝包中包含核心文件 dolphindb.html 和 dolphindb.js。其中,dolphindb.html 主要用于定義DolphinDB 節(jié)點(diǎn)的屬性、編輯對(duì)話框和幫助文本,而 dolphindb.js 則主要用于定義 DolphinDB 節(jié)點(diǎn)的功能。
在 DolphinDB 節(jié)點(diǎn)的 html 文件部分與普通 Node-RED 節(jié)點(diǎn)開發(fā)流程相似,因此這里不再贅述。我們重點(diǎn)介紹 dolphindb.js 中的節(jié)點(diǎn)功能實(shí)現(xiàn)方法,可參照:JavaScript API 進(jìn)行開發(fā)。
在 JavaScript 中連接 DolphinDB
- 在 JavaScript 中導(dǎo)入 DolphinDB,并設(shè)置連接配置,建立與 DolphinDB 的連接。
import { DDB } from 'dolphindb'// 使用 WebSocket URL 初始化連接到 DolphinDB 的實(shí)例(不建立實(shí)際的網(wǎng)絡(luò)連接)let ddb = new DDB('ws://127.0.0.1:8848', { // 是否在建立連接后自動(dòng)登錄,默認(rèn) `true` autologin: true, // DolphinDB 登錄用戶名,默認(rèn) `'admin'` username: 'admin', // DolphinDB 登錄密碼,默認(rèn) `'123456'` password: '123456', // 設(shè)置 python session flag,默認(rèn) `false` python: false, // 設(shè)置該選項(xiàng)后,該數(shù)據(jù)庫連接只用于流數(shù)據(jù) streaming: undefined})// 建立到 DolphinDB 的連接await ddb.connect()
- 建立配置節(jié)點(diǎn),連接到 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 節(jié)點(diǎn)構(gòu)造:
a. 節(jié)點(diǎn)構(gòu)造函數(shù)。節(jié)點(diǎn)由構(gòu)造函數(shù)定義,該函數(shù)可用于創(chuàng)建節(jié)點(diǎn)的新實(shí)例。該函數(shù)傳遞一個(gè)包含流編輯器中設(shè)置的屬性的對(duì)象。它必須做的第一件事是調(diào)用該 RED.nodes.createNode 函數(shù)來初始化所有節(jié)點(diǎn)共享的特征,然后就可以執(zhí)行特定于節(jié)點(diǎn)的代碼。
//構(gòu)造函數(shù) function DolphinDBNode(config) { RED.nodes.createNode(this,config); // 獲取 DolphinDB 配置結(jié)點(diǎn) this.dolphindb = n.dolphindb; this.dolphindbConfig = RED.nodes.getNode(this.dolphindb); var client = this.dolphindbConfig.client; //功能語句 } //注冊(cè)節(jié)點(diǎn) RED.nodes.registerType("DolphinDB",DolphinDBNode);
b. 接收消息。節(jié)點(diǎn)注冊(cè)該事件的偵聽器input,以接收來自流中上游節(jié)點(diǎn)的消息。一旦收到消息,就執(zhí)行相應(yīng)的功能。
this.on('input', function(msg, send, done) { //執(zhí)行功能});
- 函數(shù)語句。在 JavaScript 中,我們使用eval()函數(shù)來執(zhí)行 DolphinDB 腳本。一般來說,我們將 DolphinDB 腳本分為函數(shù)func和函數(shù)調(diào)用funcall兩個(gè)部分,然后將它們拼接在一起,并調(diào)用eval()函數(shù)來執(zhí)行 DolphinDB 腳本。
var func=`def foo(a,b){ return a b; }`var funcall=`foo(11,11)`var secipt=func funcallconst result = await ddb.eval(script)
案例
最后,我們以數(shù)據(jù)歸一化節(jié)點(diǎn)為例,來介紹 DolphinDB 節(jié)點(diǎn)的功能實(shí)現(xiàn)代碼。
//構(gòu)造函數(shù)function DolphinDataNormalizationNode(n) { RED.nodes.createNode(this, n); // 獲取 DolphinDB 配置結(jié)點(diǎn) this.dolphindb = n.dolphindb; this.dolphindbConfig = RED.nodes.getNode(this.dolphindb); if (!this.dolphindbConfig) { //檢查是否成功獲取了 DolphinDB 配置節(jié)點(diǎn) this.error(RED._("dolphindb.errors.missingconfig")); return; } var client = this.dolphindbConfig.client; //將當(dāng)前節(jié)點(diǎn)的上下文保存在變量 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 腳本,用于調(diào)試和查看。 //注冊(cè)監(jiān)聽器 input,一旦收到消息,則執(zhí)行 DolphinDB 腳本 node.on('input', async function (msg, send, done) { client.eval(script).then(res => { send(msg) done() }).catch(err => { console.log(err) done(err) }) }); } //注冊(cè)節(jié)點(diǎn)RED.nodes.registerType("數(shù)據(jù)歸一化", DolphinDataNormalizationNode);
總結(jié)
本文介紹了 Node-RED 平臺(tái),Node-RED 以其簡單的拖拽和連接節(jié)點(diǎn)的方式,讓用戶能夠輕松創(chuàng)建各種應(yīng)用程序,無需編寫繁瑣的代碼。
DolphinDB 低代碼平臺(tái)的構(gòu)建基于Node-RED。通過可視化編程方式將 DolphinDB 功能可視化為節(jié)點(diǎn),使操作流程清晰明了。其中,數(shù)據(jù)清洗和無模式寫入案例,展示了 DolphinDB 低代碼平臺(tái)的簡便性和高效性。
更重要的是,DolphinDB 低代碼平臺(tái)具有很強(qiáng)的可擴(kuò)展性。用戶可以根據(jù)自身需求開發(fā)自定義功能節(jié)點(diǎn),進(jìn)一步增強(qiáng)平臺(tái)的功能和適應(yīng)性。這種開放性為用戶提供了更多可能性和靈活性,使他們能夠在平臺(tái)上實(shí)現(xiàn)更多個(gè)性化需求。
通過 Node-RED 平臺(tái)和 DolphinDB 低代碼平臺(tái),用戶能夠輕松構(gòu)建復(fù)雜的物聯(lián)網(wǎng)設(shè)備、API 和在線服務(wù),實(shí)現(xiàn)數(shù)據(jù)處理和存儲(chǔ),加速創(chuàng)新和數(shù)字化轉(zhuǎn)型的進(jìn)程。
附件
- DolphinDB 節(jié)點(diǎn)安裝包(請(qǐng)移步知乎下載:鏈接https://zhuanlan.zhihu.com/p/653197245)