大大毛 的笔记

  DDM's Note

哪怕没有办法一定有说法,
就算没有鸽子一定有乌鸦,
固执无罪 梦想有价,
让他们惊讶.

posts - 14, comments - 23, trackbacks - 0, articles - 58
   :: 首页 ::  :: 联系 ::  :: 管理

RouteOnAttribute的用法

Posted on 2019-04-11 16:55 大大毛 阅读(1745) 评论(0)  编辑  收藏 所属分类: Nifi
RouteOnAttribute
    这个组件的是用途是根据Attribute的值进行Route分流,从输入输出的角度来看,它可以把一个Input分成多个Output出来,它的分支不同于程序中的Switch语法,而等效于多条的IF语句,也就是说若Output的条件全部都符合,它是可以把1个输出Copy到多个输出的,所以它也可以用于条件复制的应用上。
    关于资料落地的文章里我有提到过Route的使用范围,它应该用在能够以Key做分支条件的场景,也就是说相同的Key一定会走固定的Output出来,这样才不会出现资料乱序的状况。下面有两个示例,第一个是典型的分支用法,第二个比较有意思,它的作用相当于Oracle中的Decode语法

示例1
    使用Route做流程的分支,根据一个叫SO的栏位是否为空决定走不同的流程(左右的UpdateAttribute可以把它们想象成两个完全不同的处理流程来看)




    RouteOnAttribute作用是根据Attribute的Bool值来决定是否进入该分支

  • HasSO / NonSO:这是我自行定义的两个Route名称 (不是属性名称),Value是一个表达式,若它的值=true,则Output会进该Route
    • Nifi的表达式语法不怎么好写,官方的文档上有些东西并不支持 (不确定是不是Nifi版本缘故)。这里还是可以看得出来就只是判断一个叫SO的Attribute的值是否为空 --- 还记得有些Processor里面还有叫"Null Value Representation"的属性吧,若是那里配成"null"那这里也要与之匹配。
  • 经过该Processor处理后,SO为空的会走右端逻辑,而不为空的则会走左段逻辑,同时它会加多一个叫"RouteOnAttribute.Route"的Attribute,内容即为Route名称

示例2:
    根据多个栏位是否有值(不为空),让它们能够进入不同的Route,后面再根据Route名称去动态的取值,它的特点是Nifi流程并没有出现分支(Connection上是勾了所有的Route),只是为不同的数据设上了一个变量名称



    RouteOnAttribute借用分支名称在后面搞事,这里相当于是给资料加上了一个变量名称

  • MO / MODELFAMILY / UPN / USN:这是定义的四个Route名称,判断条件都很简单,就只是不为空
    • 值得注意的是这4个条件并非是互斥条件,比如有一笔资料它的MO、USN都不为空,那么就会同时进入两个Route进行输出,所以Output笔数会是2
    • 下面这是进入UPN这个Route后的资料上的Attribute: "RouteOnAttribute.Route"



    UpdateAttribute比较精彩的用法

  • mqttTopic:这是定义的一个MQTT的Topic变量,它的内容是可变动的,会根据Route的不同产生不同的结果
    • MO/MODELFAMILY/UPN/USN这4个条件有任一不为空,则会要求推送Topic: xxxx/【Type】/【Value】/yyyy
      • 【Type】: 为"mo"、"modelfamily"、"upn"、"usn"这四个值之一
      • 【Value】: 为MO/MODELFAMILY/UPN/USN这四个Attribute的取值 (即 ${MO} / ${MODELFAMILY} / ${UPN} / ${USN} 的值),这里使用了双层${${"RouteOnAttribute.Route"}}的取值方法来实现动态的取用变量值




只有注册用户登录后才能发表评论。


网站导航:
 

i am ddm