在工業(yè)數(shù)據(jù)管理平臺的建設(shè)中,數(shù)據(jù)接入往往是最耗時且最容易出錯的環(huán)節(jié)。不同的數(shù)據(jù)源可能使用不同的物理單位、命名規(guī)則和時區(qū)設(shè)置,直接寫入數(shù)據(jù)庫會導(dǎo)致數(shù)據(jù)質(zhì)量參差不齊。TDengine內(nèi)置的ETL功能,能夠在數(shù)據(jù)寫入過程中完成解析、提取、過濾和轉(zhuǎn)換,實現(xiàn)零代碼的數(shù)據(jù)清洗和標(biāo)準(zhǔn)化。
為什么需要內(nèi)置ETL
在典型的工業(yè)場景中,數(shù)據(jù)源具有以下特征:
- 多源異構(gòu):來自PLC、傳感器、SCADA系統(tǒng)等多種設(shè)備的數(shù)據(jù)格式各不相同
- 單位不統(tǒng)一:溫度可能使用攝氏度或華氏度,壓力可能使用Pa、kPa或MPa
- 命名規(guī)則差異:不同廠商的設(shè)備使用不同的標(biāo)簽命名規(guī)范
- 時區(qū)不一致:全球部署的設(shè)備可能分布在不同時區(qū)
傳統(tǒng)的做法是在應(yīng)用層或中間件中處理這些差異,增加了系統(tǒng)復(fù)雜度和維護(hù)成本。TDengine將ETL能力內(nèi)置在數(shù)據(jù)接入流程中,數(shù)據(jù)在寫入數(shù)據(jù)庫之前即可完成標(biāo)準(zhǔn)化處理,簡化了整體架構(gòu)。
解析功能:從原始數(shù)據(jù)中提取結(jié)構(gòu)化信息
解析是ETL流程的第一步,負(fù)責(zé)將原始數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化的字段。TDengine支持三種解析方式。
JSON解析
JSON是物聯(lián)網(wǎng)設(shè)備最常用的數(shù)據(jù)交換格式。TDengine支持JSONObject和JSONArray兩種JSON格式的解析。
對于簡單的JSON結(jié)構(gòu),系統(tǒng)可以自動解析,將JSON中的鍵值對直接映射為數(shù)據(jù)庫字段。對于嵌套的JSON結(jié)構(gòu),可以使用JSON Path表達(dá)式進(jìn)行手動解析,精確提取嵌套層級中的目標(biāo)字段。
例如,設(shè)備上報的數(shù)據(jù)可能包含多層嵌套的傳感器讀數(shù),通過JSON Path可以精準(zhǔn)定位并提取所需的數(shù)值字段,而忽略不需要的元數(shù)據(jù)信息。
Regex正則表達(dá)式解析
當(dāng)原始數(shù)據(jù)為非結(jié)構(gòu)化的字符串時,正則表達(dá)式是最靈活的解析工具。TDengine支持使用命名捕獲組從任何字符串字段中提取多個字段。
命名捕獲組的語法為(?P<name>pattern),其中name為提取后的字段名,pattern為匹配模式。這種方式特別適用于解析老舊設(shè)備的日志輸出、自定義協(xié)議的數(shù)據(jù)報文等場景。
UDT自定義解析腳本
對于JSON和正則表達(dá)式都無法覆蓋的復(fù)雜解析需求,TDengine提供了UDT(User Defined Transform)自定義解析腳本功能。UDT使用rhai語法編寫,支持json格式的原始數(shù)據(jù)作為輸入。
rhai是一種輕量級的嵌入式腳本語言,語法簡潔且執(zhí)行效率高。通過UDT,用戶可以實現(xiàn)任意復(fù)雜度的解析邏輯,例如多行數(shù)據(jù)的關(guān)聯(lián)解析、條件分支處理等。
提取與拆分功能
解析完成后,某些字段可能需要進(jìn)一步拆分或轉(zhuǎn)換。TDengine提供了兩種提取規(guī)則和一種轉(zhuǎn)換規(guī)則。
split拆分規(guī)則
split規(guī)則通過設(shè)置分隔符和拆分?jǐn)?shù)量,將一個字段拆分為多個字段。例如,設(shè)備ID中可能包含”工廠-車間-設(shè)備”的層級信息,通過split可以將其拆分為三個獨(dú)立字段,便于后續(xù)的分組查詢。
regex提取規(guī)則
regex提取規(guī)則與解析階段的正則表達(dá)式類似,但作用于已解析的字段值。使用命名捕獲組從字段值中提取子串,適用于字段值中包含結(jié)構(gòu)化子信息的場景。
convert值轉(zhuǎn)換
convert規(guī)則通過填寫JSON map對象進(jìn)行值轉(zhuǎn)換。例如,將設(shè)備的數(shù)字狀態(tài)碼轉(zhuǎn)換為可讀的文本描述:{"0": "停止", "1": "運(yùn)行", "2": "故障"}。這種轉(zhuǎn)換在數(shù)據(jù)可視化場景中非常有用,能夠直接在數(shù)據(jù)庫層面完成數(shù)據(jù)的語義化。
過濾功能:精準(zhǔn)控制入庫數(shù)據(jù)
并非所有采集到的數(shù)據(jù)都需要寫入數(shù)據(jù)庫。TDengine的過濾功能支持豐富的條件表達(dá)式,幫助用戶在入庫前精準(zhǔn)篩選數(shù)據(jù)。
比較操作符
支持標(biāo)準(zhǔn)的比較操作符:>、>=、<=、<、==、!=??梢杂糜跀?shù)值范圍過濾,例如只保留溫度在合理范圍內(nèi)的數(shù)據(jù)。
時間函數(shù)
between_time_range(ts, t1, t2)函數(shù)用于過濾指定時間范圍內(nèi)的數(shù)據(jù),支持按時間段篩選。在時序數(shù)據(jù)庫的數(shù)據(jù)回填場景中,該函數(shù)可以精確控制入庫數(shù)據(jù)的時間范圍。
字符串函數(shù)
支持以下字符串判斷函數(shù):
is_empty:判斷字段是否為空contains:判斷字段是否包含指定子串starts_with:判斷字段是否以指定前綴開頭ends_with:判斷字段是否以指定后綴結(jié)尾len:獲取字段長度
這些函數(shù)可以組合使用,構(gòu)建復(fù)雜的過濾條件。例如,過濾出設(shè)備名稱以”TEMP_”開頭且描述字段不為空的記錄。
邏輯操作符
支持&&(與)、||(或)、!(非)三種邏輯操作符,可以將多個過濾條件組合為復(fù)雜的布爾表達(dá)式。
類型轉(zhuǎn)換函數(shù)
parse_int和parse_float函數(shù)用于將字符串類型的數(shù)據(jù)轉(zhuǎn)換為數(shù)值類型,便于后續(xù)的數(shù)值比較和計算。
映射規(guī)則:構(gòu)建目標(biāo)字段
映射規(guī)則定義了如何將解析和提取后的數(shù)據(jù)映射到目標(biāo)數(shù)據(jù)庫的字段。TDengine提供了七種映射方式,覆蓋了絕大多數(shù)數(shù)據(jù)轉(zhuǎn)換需求。
mapping直接映射
最基礎(chǔ)的映射方式,將源字段直接映射到目標(biāo)字段。適用于字段名稱和含義完全一致的場景。
value常量值
為字段設(shè)置固定的常量值。例如,為所有來自同一數(shù)據(jù)源的數(shù)據(jù)添加固定的”數(shù)據(jù)源標(biāo)識”字段,便于后續(xù)的數(shù)據(jù)溯源。
generator時間戳生成器
now生成器用于生成當(dāng)前時間戳。在某些設(shè)備不攜帶時間戳的場景中,可以使用該生成器在入庫時自動添加時間戳。
join字符串連接
將多個字段的值拼接為一個字符串。例如,將”工廠編號”和”設(shè)備編號”拼接為完整的設(shè)備標(biāo)識符。
format字符串格式化
format工具提供了豐富的字符串處理函數(shù):
pad:字符串填充trim:去除首尾空白字符sub_string:截取子串replace:字符串替換
這些函數(shù)可以組合使用,實現(xiàn)復(fù)雜的字符串格式化需求。
sum數(shù)值加法
將多個數(shù)值型字段相加。適用于需要將多個傳感器讀數(shù)匯總為一個綜合指標(biāo)的場景。
expr數(shù)值運(yùn)算表達(dá)式
expr支持完整的數(shù)值運(yùn)算能力,包括四則運(yùn)算(+、-、*、/)和數(shù)學(xué)函數(shù)(sin、cos、sqrt等)。這是最靈活的映射方式,可以實現(xiàn)任意復(fù)雜的數(shù)值計算。
例如,將華氏溫度轉(zhuǎn)換為攝氏度:expr: (col_fahrenheit - 32) * 5 / 9。通過在ETL階段完成單位轉(zhuǎn)換,確保入庫數(shù)據(jù)的一致性。
實踐建議
在實際使用內(nèi)置ETL功能時,建議遵循以下原則:
- 優(yōu)先使用自動解析:對于標(biāo)準(zhǔn)JSON格式,優(yōu)先使用自動解析,減少配置工作量
- 合理設(shè)置過濾條件:在入庫前過濾無效數(shù)據(jù),減少存儲壓力和后續(xù)查詢的負(fù)擔(dān)
- 統(tǒng)一單位標(biāo)準(zhǔn):在ETL階段完成所有單位轉(zhuǎn)換,確保數(shù)據(jù)庫中存儲的數(shù)據(jù)使用統(tǒng)一的度量單位
- 利用映射規(guī)則豐富數(shù)據(jù)維度:通過常量值、字符串連接等方式,在入庫時添加業(yè)務(wù)維度信息
總結(jié)
TDengine內(nèi)置的ETL功能為時序數(shù)據(jù)庫的數(shù)據(jù)接入提供了強(qiáng)大的數(shù)據(jù)清洗和轉(zhuǎn)換能力。從JSON解析到正則提取,從條件過濾到靈活映射,覆蓋了工業(yè)數(shù)據(jù)管理平臺中數(shù)據(jù)標(biāo)準(zhǔn)化的核心需求。通過在數(shù)據(jù)寫入流程中集成ETL處理,企業(yè)可以顯著降低數(shù)據(jù)接入的開發(fā)和維護(hù)成本,同時保證入庫數(shù)據(jù)的質(zhì)量和一致性,為后續(xù)的分析和決策奠定堅實的數(shù)據(jù)基礎(chǔ)。



互聯(lián)網(wǎng).png)



-1.png)







證.png)


伙伴.png)
伙伴.png)
伙伴.png)



