iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
AI & Data

Apache NiFi - 讓你輕鬆設計 Data Pipeline系列 第 14

Day14 NiFi - NiFi Expression Language

今天要來介紹的是 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


上一篇
Day13 NiFi - Variables & Parameters
下一篇
Day15 NiFi - 與 RDB 對接設定
系列文
Apache NiFi - 讓你輕鬆設計 Data Pipeline30

尚未有邦友留言

立即登入留言