數(shù)據(jù)加工語法
SLS DSL基于Python語言開發(fā),提供兩百多個內(nèi)置函數(shù)來簡化數(shù)據(jù)加工任務(wù)。本文介紹DSL的語言模式、分類和運(yùn)行原理等。
語言模式
SLS DSL兼容Python,標(biāo)準(zhǔn)模式下,SLS DSL可視為Python的子集。除基本的數(shù)據(jù)結(jié)構(gòu)與表達(dá)方式外,語法規(guī)則是以函數(shù)方式進(jìn)行編排。如果您有特定UDF的需求,請?zhí)峤?span props="china">工單。
類別 | Python語法 | 標(biāo)準(zhǔn)模式 |
數(shù)據(jù)結(jié)構(gòu) | 數(shù)字、字符串、布爾 | 支持。 不支持 |
元組、列表、集合、字典 | 支持。 不支持集合 | |
對象 | 僅支持內(nèi)置擴(kuò)展數(shù)據(jù)結(jié)構(gòu),如表格、日期時間對象等。 | |
基本語法 | 操作符,如加減乘除等 | 支持比較運(yùn)算符( |
注釋 | 支持。 | |
變量定義賦值 | 不支持,需使用函數(shù)調(diào)用傳遞。 | |
條件 | 支持。例如e_if、e_if_else、e_switch函數(shù)。 | |
循環(huán) | 不直接支持,可通過內(nèi)置函數(shù)嵌套實(shí)現(xiàn)。例如如下遍歷數(shù)組:
| |
函數(shù) | 標(biāo)準(zhǔn)Python內(nèi)置函數(shù) | 不支持。使用200+內(nèi)置函數(shù)。 |
函數(shù)調(diào)用 | 支持。解包調(diào)用不支持。 | |
自定義函數(shù)def或lambda | 不支持,提供兩百多個全局操作函數(shù)與表達(dá)式函數(shù),且支持基于現(xiàn)有函數(shù)的自由組合調(diào)用。 | |
模塊 | 導(dǎo)入與使用Python標(biāo)準(zhǔn)庫 | 不支持。 |
線程與進(jìn)程創(chuàng)建 | 不支持。 | |
導(dǎo)入第三方庫 | 不支持。 | |
外部網(wǎng)絡(luò)連接或命令調(diào)用 | 支持內(nèi)置的資源連接器。 |
函數(shù)分類
標(biāo)準(zhǔn)模式的SLS DSL是通過調(diào)用函數(shù)的方式完成的,其內(nèi)置兩百多個函數(shù),主要分為兩類:
全局操作函數(shù)
主要用來接收日志、處理并返回日志的函數(shù)。且只有全局操作函數(shù)才能構(gòu)建加工規(guī)則的每個步驟。
表達(dá)式函數(shù)
通用型函數(shù),接受特定參數(shù),組合調(diào)用后作為參數(shù)傳遞給全局操作函數(shù)以定義更加靈活的邏輯。
兩類函數(shù)功能對比:
函數(shù)類型 | 全局步驟 | 接收 | 返回 | 修改日志 | 組合調(diào)用 |
全局操作函數(shù) | 支持 | 自動接收日志 | 0到多條日志 | 支持大部分情況 | 支持 |
表達(dá)式函數(shù) | 不支持 | 除個別函數(shù)支持,大部分不直接處理日志。 | 特定數(shù)據(jù)結(jié)構(gòu) | 不支持 | 支持 |
全局操作函數(shù)
接收日志并返回日志的函數(shù)。
除全局函數(shù)外,其他內(nèi)置函數(shù)不能放在每個步驟的第一行。
一個SLS DSL規(guī)則的形式如下:
全局函數(shù)1(..參數(shù)....)
全局函數(shù)2(..參數(shù)....)
全局函數(shù)3(..參數(shù)....)
全局函數(shù)4(..參數(shù)....)
全局操作函數(shù)可以分為兩類:
函數(shù)分類 | 描述 | 樣例 |
流程控制函數(shù) | 用于步驟流程控制,接收日志,基于條件控制調(diào)用其他日志函數(shù)完成日志處理。 |
|
事件處理函數(shù) | 對日志進(jìn)行加工的函數(shù) 。返回0到多條日志。 | 函數(shù)樣例如下:
|
加工邏輯:
基本處理:
數(shù)據(jù)加工會以流式方式讀取源Logstore的數(shù)據(jù),并將每一條日志以字典的數(shù)據(jù)結(jié)構(gòu)傳遞給加工規(guī)則,然后根據(jù)加工規(guī)則中定義的日志函數(shù)順序處理日志數(shù)據(jù),并將最終的數(shù)據(jù)加工結(jié)果輸出到目標(biāo)Logstore。
說明在傳遞的過程中日志的字段和值始終都是字符串形式。例如:原日志是
{"__time__": "1234567", "__topic__": "", "k1": "test"}
,函數(shù)e_set("f1", 200)
設(shè)置字段f1
的值為200,經(jīng)過這個函數(shù)處理后,原日志會變成:{"__time__": "1234567", "__topic__": "", "k1": "test", "f1": "200"}
,其中f1
和200都是字符串類型。規(guī)則中定義的每個日志函數(shù)會順序執(zhí)行,每個函數(shù)會對每個日志進(jìn)行處理和修改,最后返回修改后的日志。
例如
e_set("type", "test")
會對每個日志添加一個字段type
,值為test,下一個函數(shù)接收到的就是修改后的日志。條件判斷:
條件判斷e_if:某些日志可以增加條件判斷,不滿足條件的日志就會跳過本次操作,相當(dāng)于一個
if
的邏輯。例如
e_if(e_match("status", "200"), e_regex("data", "ret: \d+", "result"))
,會首先判斷字段status
是否為200,如果條件判斷為真,則會對字段data
用正則表達(dá)式提取出新字段result
;如果條件判斷為否,則不會執(zhí)行任何操作。e_if_else
:與if_else
操作類似。
停止處理:
某些步驟可能返回0個日志,表示刪除日志。
例如
e_if(str_islower(v("result")), e_drop())
,如果每個result
字段的值是小寫字符串,則丟棄這條日志,后續(xù)的操作將不再進(jìn)行,自動重新開始下一條日志。輸出日志可以視為一種特殊的停止處理,例如
e_output
提前輸出日志到目標(biāo)并刪除日志,其后續(xù)的操作也不會再進(jìn)行。說明函數(shù)
e_coutput
會復(fù)制一份當(dāng)前的日志輸出,并繼續(xù)處理后續(xù)。
分裂并行:
某些步驟也可能返回多個日志,表示分裂日志。
例如
e_split(data)
,表示根據(jù)字段data
的值將原本的一條日志分裂成兩條日志。假如data
的值是"abc, xyz"
,則分裂后兩條日志字段data
的值分別是abc和xyz。分裂后的每條日志都會繼續(xù)進(jìn)行后續(xù)的步驟。
更多關(guān)于全局函數(shù)的說明,請參見全局操作函數(shù)概覽。
表達(dá)式函數(shù)
除了全局操作函數(shù)外,SLS DSL還提供200個表達(dá)式函數(shù),接收特定參數(shù),返回特定的值,一般是單個表達(dá)式函數(shù)或其調(diào)用組合。形式如下:
全局操作1(表達(dá)式函數(shù)1(...), ....)
全局操作2(..., 表達(dá)式函數(shù)2(...), 表達(dá)式函數(shù)3(...),...)
表達(dá)式函數(shù)大概可以分為四類:
函數(shù)分類 | 描述 | 樣例 |
事件檢查函數(shù) | 接收日志,提取或檢索返回特定信息的函數(shù),不會修改傳遞的日志。 | 函數(shù) |
資源函數(shù) | 連接本地或外部資源,接收特定參數(shù)配置并返回數(shù)據(jù),一般是字典、表格等類型。 | OSS、RDS、Logstore資源函數(shù)。 |
控制函數(shù) | 用于表達(dá)式的邏輯操作,接收特定參數(shù)并基于條件做控制,調(diào)用其他表達(dá)式函數(shù)返回結(jié)果。 |
|
其他表達(dá)式函數(shù) | 接受固定或者其他函數(shù)的調(diào)用結(jié)果,返回特定的值。 | 字符串、時間、類型轉(zhuǎn)換函數(shù)等。 |
更多關(guān)于表達(dá)式函數(shù)的說明,請參見表達(dá)式函數(shù)概覽。