今天要來介紹的是 NiFi Expression Language (以下簡稱NEL)。在前一篇我們已經介紹了 Variables 和 Parameters 這兩種概念,其中 Variables 會從上游的 Processors 所產生的attributes 帶到下游的 Processors,但有時候我們會需要利用這些 attributes 做一些處理、判斷等操作,這時候就可以透過 NEL 來做到這件事情了,所以下面我們就開始來了解一下如何運用吧

What is the NEL?

NEL 我們可以想成他是在 NiFi 內建好的 function,根據 官方文件 ,我們可以將大概分為以下幾類:

Boolean Logic
這一類簡單來說就是回傳一些 Bool 的 NEL,以及一些條件判斷的 NEL,ex. ifElse, isNull, equals, etc.

String Manipulation
這一類則是做一些字串的操作,例如大小寫轉換、append 字串、substring等相關字串應用。對應的 NEL 有 toUpper, toLower, trim, replace, etc.

Encode/Decode Functions
這一類則是將字串轉成特定格式的編碼,ex. escapeJson, escapeCsv, etc.

Searching
這一類則是搜尋字串內的字,或是做一些包含等判斷,ex. startWith, in, contains, matches, etc.

Mathematical Operations and Numeric Manipulation
這一類就很單純地是做一些數學運算的處理,ex. plus, minus, mod, etc.

Date Manipulation
這一類是做一些日期上的運算,ex. format, toDate, now, etc.

Type Corericon
這一類則是做些轉型的運算,ex. tostring, toNumber, toDecimal, etc.

Subjectless Functions
這一類則是用在不需要配合 Variables 的 NEL,像是要取的 ip, hostname 等,他可以直接 ${ip} , ${hostname} 來做呼叫,就不用像其他類 ${variables:function()} 這樣的方式做使用。

Evaluating Multiple Attributes
這一類則是針對多的 attributes 作處理和判斷,當然也可以用 and 或 or 等做運算,但 NiFi 也有提供類似的 NEL 來做類似的處理。

How to use?

在 NEL 的用法上,Variables 後面透過 : 來接 NEL function,就代表該 Variables 套用到這個 function上;此外,NEL 可採用 link-usage,也就是 Variables 後面可以接多的 NEL,範例如下:

${filename:toUpper():equals("HELLO.TXT")}

這個意思就是在 FlowFile 中的 filename 這個 attributes 的 value,先轉成大寫,接著判斷是否為 "HELLO.TXT"。所以可以發現,我們可以在後面接續著很多的 NEL function,這就是 Link-usage。

這裡我們在拿先前用到的例子來做簡單的說明,我們來看一下紅框中的 RouteOnAttribute Processor,如果大家還記得的話,這個 Processor 是可以由我們自定義 output 出去的 Connection:

其中內部的設定長得像這樣:

embark_c: ${embark:equals("C")}
embark_q: ${embark:equals("Q")}
embark_s: ${embark:equals("S")}

代表著流到這裡的 FlowFiles 都會有一個 embark 這個 attributes,我們希望當它等於 C 的時候流向 embark_c Connection; 等於 Q 的時候流向 embark_q Connection; 而等於 S 的時候則流向 embark_c 的 Connection。

所以我們就可以透過 NEL 搭配 Variables 來做一些處理及判斷,這樣的操作是不是相對簡單呢?

這邊再帶另外一個範例,是關於時間的操作,我們簡單拉一個 GenerateFlowFile 的 Processor 就好:

其中內部的設定長這樣:

datetime: ${now()}
timestamp: ${now():toNumber()}
today_format: ${now():format('yyyy-MM-dd')}
yesterday: ${now():toNumber():minus(86400000):format('yyyy-MM-dd')}

就可以看到 FlowFiles 會產生對應的 attributes:

所以透過這樣簡單的範例,想必大家都大概知道 NEL 是如何操作的了,今天這篇提了兩個簡單小範例,在系列文最後面會有一個比較大的場境應用,到時候也會有較複雜的 NEL 操作,但只要讀者們掌握好 NEL 的精髓和使用方式,其實就很容易上手了。

今天大概提了一下 NEL 的用法與操作,其實真的不難,只要掌握好原則,再搭配 document 的範例與說明,就能輕鬆將 attributes 處理成自己想要的樣子。

到這篇為止,大致上 NiFi 本身幾個重要的 Componenet 都介紹到一輪了,像是 Processor, Connection, Processor Group等,明天開始我們會進入到下一個環節,也就是與DB, Cloud 服務的對接說明,主要會拿 DB, AWS 和 GCP 來做一個介紹與範例,這樣的範例在實務上是很常用到的,同時也是非常重要的議題,所以接下來的幾篇,也要好好地學起來!

Reference

NiFi Expression Language