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


<<:  Day21 Metricbeat(二)

>>:  使用 MockK 做测试

Day16 - 复习 Vue 生命周期

今天又跟大神学习 重新认识 Vue.js | Kuro Hsu 1-7 元件的生命周期与更新机制,(...

课堂笔记 - 物联网概论 课後测验

课後测验 单选题 感知层(单选题) 1.下列哪一项不属於物联网的应用? A.洗衣机於电费最低时段自...

[Angular] Day2. Angular CLI

大家都说"工欲善其事必先利其器",在我们发开 Angluar 时,必需了解一个非...

电脑电源大4pin接口定义及风扇接法

大4pin针脚定义 1 - 12V 黄色线2 - 0V 黑色线3 - 0V 黑色线4 - 5V 红...

Day20-pytorch(3)设置model、使用pytorch设置loss function及updata参数

我们透过简单的regression来认识如何设置model及如何使用pytorch设置loss fu...