联系我们
简单又实用的WordPress网站制作教学
当前位置:网站首页 > 程序开发学习 > 正文

APACHE NIFI学习之—UpdateAttribute

作者:小教学发布时间:2023-10-02分类:程序开发学习浏览:81


导读:UpdateAttribute描述:通过设置属性表达式来更新属性,也可以基于属性正则匹配来删除属性标签:attributes,modification,upda...

UpdateAttribute

描述:

通过设置属性表达式来更新属性,也可以基于属性正则匹配来删除属性

标签:

attributes, modification, update, delete, Attribute Expression Language, state, 属性, 修改, 更新, 删除, 表达式

参数:

如下列表中,必填参数则标识为加粗. 其他未加粗参数,则表示为可选参数。表中同时提到参数默认值设置, 并且 参数还支持 表达式语言.

名字默认值允许值列表描述
删除属性正则将删除与正则匹配相匹配的数据流上的属性, Existing attributes that match will be deleted regardless of whether they are updated by this processor. 支持表达式语言 (支持流属性和变量)
存储状态不存储不存储仅本地存储是否需要存储状态,选择“无状态”将提供以无状态方式单纯的更新流文件属性。选择有状态将不仅在数据流上存储属性,还存储组件状态。 可查看组件'高级设置'的'状态用法'章节获取更多信息
状态变量初始化值用于设置变量状态的初始值。 当状态中没有一个变量的值时,该值仅被用在@OnScheduled方法中。如果是有状态的,则该参数是必须的,但也可以设置为空

动态参数:

名字描述
A FlowFile attribute to updateThe value to set it to更新或设置一个数据流属性,该参数可通过动态参数的键值来设置,且与属性对应。 支持表达式语言 (支持流属性和变量)

连线:

名字描述
success所有成功的数据流将输出到此连线

读取属性:

未提供。

写入属性:

名字描述
See additional details组件可以添加或删除0到多个属性描述,参见附加详细信息

状态管理:

范围描述
LOCAL提供选项来存储数据流的属性值,也引用有状态变量

限制:

该组件没有限制

输入流要求:

组件必须提供输入流。

系统资源考量:

未提供。

* 遇到的问题

问题1:如何在Nifi中将属性设置为空字符串

解决方法:${literal("")}

试试

attribute_name

${literal("")}

问题2:增加一个属性

id2 233

img

输出结果:

问题3:条件判断

高级用法,添加规则条件,符合条件时update指定的属性值

  1. 点击ADVANCED

    img

  2. 添加一个rule,如果id的值等于11,就修改id的值为22

    img

  3. 结果输出:

    img

问题4:将属性提取到内容

  • 需要增加ReplaceText组件

${dict.51字段}

问题5:删除某一些的属性

(orderParties|containerList|goods)

  • UpdateAttribute(清除body以外属性)

(body.+)

img

Delete Attributes Expression

(SP.*\.[0-9]+.*)

Delete Attributes Expression

bkCargo.*  

它表示要删除以 "bkCargo." 开头的所有属性。这种方式允许您一次性删除多个属性,只要它们都以相同的前缀开始。

举个例子,假设您有属性 bkCargo.namebkCargo.typebkCargo.weight 等等,使用 bkCargo.* 表达式会删除所有以 "bkCargo." 开头的属性,将它们从数据中删除。

问题6:日期获取

  1. 获取前一天的数据

dict.startTime:

${now():format("yyyy-MM-dd", "GMT"):toDate('yyyy-MM-dd'):addDays(0):format("yyyy-MM-dd", "GMT")}T00:00:00

dict.endTime:

${now():format("yyyy-MM-dd", "GMT"):toDate('yyyy-MM-dd'):addDays(0):format("yyyy-MM-dd", "GMT")}T23:59:59
  1. 获取前2个月至今的数据

dict.startTime:

${now():format("yyyy-MM", "GMT+8"):toDate('yyyy-MM'):addMonths(-1):format("yyyy-MM", "GMT")}-01T00:00:00

dict.endTime:

${now():format("yyyy-MM-dd", "GMT+8")}T${now():format("HH:mm:ss", "GMT+8")}
  1. updateAttribute组件获取当前时间

${now():format('yyyy-MM-dd HH:mm:ss')}

问题7:JsonPath表达式解读

dict.BLiStotalNoofPackages

${bkCargo:jsonPath('$[?(@.cargoFlag in ["M"])]'):jsonPath('$.noOfPackage')}

这段代码是使用 JSONPath 表达式来从 JSON 数据中提取信息的。JSONPath 是一种类似于 XPath 的查询语言,用于从 JSON 结构中选择和提取数据。让我一步步解释这段代码的含义:

  1. ${bkCargo:jsonPath('$[?(@.cargoFlag in ["M"])]')}: 这部分的含义是从一个名为 bkCargo 的 JSON 对象中,使用 JSONPath 查询,筛选出具有 cargoFlag 属性值为 "M" 的元素。换句话说,这部分代码会返回一个包含满足条件的货物的数组或集合。

  2. :jsonPath('$.noOfPackage'): 这部分的含义是在上一步得到的满足条件的货物数组中,再次使用 JSONPath 查询,提取每个货物元素的 noOfPackage 属性值,即货物的包裹数量。

综合起来,整个代码的目的是从名为 bkCargo 的 JSON 数据中,选取具有 cargoFlag 属性值为 "M" 的货物,并且提取这些货物的包裹数量(noOfPackage 属性值)。最终,这段代码将会返回一个包含满足条件货物的包裹数量的数组或集合。

问题8:数据分流合并数据

8.1 初始化分段合并所需参数

infosp.count:

2

infosp.identifier:

${UUID()}

8.2 设置分段合并所需参数1

infosp.index:

1

8.2 设置分段合并所需参数2

infosp.index:

2

8.3 设置复原infosp分段参数

fragment.count:

${infosp.count}

fragment.identifier:

${infosp.identifier}

fragment.index:

${infosp.index}

问题9:多条件判断

dict.运输条款END2等于CY的时候等于Y

dict.运输条款END2等于CFS的时候等于S

dict.运输条款END2等于DOOR的时候等于D

${dict.运输条款END2:equals('CY'):ifElse('Y', ${dict.运输条款END2:equals('CFS'):ifElse('S', ${dict.运输条款END2:equals('DOOR'):ifElse('D', '')})})}





程序开发学习排行
最近发表
网站分类
标签列表