NiFi-用于创建具有前一个属性+编码文本的新属性的新属性

问题描述 投票:0回答:2

我正在尝试添加新的“ attributeX”以创建URL(使用UpdateAttribute)。该网址将如下所示:第1部分:固定值(例如:“ www.google.com/”)第2部分:评估属性1;如果为空,则使用属性2:如果不为空,则使用属性1。第3部分:经过编码的值(例如:“ / tests /”)第4部分:attribute3

属性1,2和3存在于先前处理器的流文件中。因此,我的目标是获取这样的网址:www.google.com/attribute1或attribute2 / tests / attribute3

但是;此“ attributeX”需要一个条件:如果attribute3为空,则需要将值设置为“空”:如果不为空,则需要创建该URL。

我正在尝试使用正则表达式,但是无法完成。当我尝试使用经编码的值+属性设置“ ifElse”时,我的“ isEmpty”和“ ifElse”评估失败。

非常感谢您的帮助,在此先感谢您!

编辑:我没有指定任何测试,因为我做了很多尝试并且无法获得预期的属性。我正在尝试做这样的事情:

${attributeA:isEmpty():ifElse(${literal("")},hardcodedText+${attributeB}+${attributeA})}

表达式在逗号后面的参数之前一直有效;如果我仅使用1个属性/变量,则效果很好;但是,如果我尝试使用1个以上的属性,则该属性不会被识别为有效的表达式。

regex apache-nifi
2个回答
0
投票

@@ NahuelGonzalez,您应该分享表达语言的进步,以便我们了解您的工作。应该可以在单个NiFi表达式语言字符串中执行所有if / else逻辑。有时问题可能是简单的(,:,或'丢失或放错位置。

但是,我可能会以其他方式进行。在isEmpty逻辑的上游创建不同的组合属性。然后,您可以在函数响应中使用所需的特定URL。

您还可以使用RouteOnAttribute将流拆分为创建不同URL的不同updateAttributes。然后将所有网址的流重新组合在一起。


0
投票

只要所有组件属性都在此表达式之前定义(即,在较早的组件中填充,或者empty可以,则可以使用这样的表达式:

${attributeA:isEmpty():ifElse(${literal("")},${literal("hardcodedText"):append(${attributeB}):append(${attributeA})})}

您尝试过的陈述的问题(仅供学习,而不是批评您尝试过的问题:]

  • attributeA:isEmpty():ifElse(${literal(""),...}具有使用原始字符串连接的辅助子句,Apache NiFi表达式语言不支持该子句。您需要在此处使用append()函数,或在子句之外使用字符串插值(即attributeA = xattributeB = y${attributeA}_${attributeB}-> x_y)。
  • [当组合多个“子句”时,每个子句都需要${}的表达语言语法表示该子句,以便可以对其进行解释。否则,可以将其注册为未知的“令牌”。因此,在上述情况下,您具有多个级别的EL子句(使用简洁的伪代码):
if (attributeA is empty) { (1)
    use "" (2)
} else {
    use "hardcodedText" + attributeB + attributeA (3)
}

表达式3是需要附加EL子句的地方。

如果要合并的元素都是属性,则也可以使用${allAttributes(attributeA, attributeB, ...):join("")}构造。

© www.soinside.com 2019 - 2024. All rights reserved.