我是apache nifi、表达式语言的新手。我需要在此基础上验证流文件属性值和路由。
这是我的要求。
更新:详细要求:
{
"REC_YEAR": 2020,
"DESCRIPTION": "test",
"CURRENCY_CD": "USD",
"CALCULATED_FLAG": "N",
"CUR_IND": "Y",
"START_DT": "2020-12-19 17:33:35",
"END_DT": "9999-12-31 00:00:00"
}
>
使用“EvalateJsonPath”处理器,我将json attrs读入了flow file属性。
其中一个名为CURRENCY_CD的属性可以是NULL/空,或者如果它不为空,那么它的长度应该是3个字符-
所以VALID数据用例CURRENCY_CD可以是空、空或任何3字符字符串。该attr的任何其他值都被视为INVALID输入数据并路由到记录处理器流。
我想出了以下逻辑来验证CURRENCY_CD需求:
${${CURRENCY_CD: is空()}:or(${CURRENCY_CD:is空():not():and(${CURRENCY_CD:long():equals(3)})}) }
然后我使用“RouteOn属性”处理器检查此属性的值并相应地路由到无效流(用于日志记录)或传递传入数据以进一步处理工作流阶段。
输入数据:现在,当我在json中将输入数据作为空字符串提供时,我希望它是TRUE。但它总是以FALSE结束。我在这里做错了什么?
输入样本#1
{
"CURRENCY_CD": ""
}
输入样本#2
{
"CURRENCY_CD": null
}
如果我尝试将此逻辑分解为多个属性以分别检查表达式布尔条件,它确实计算正确。组合它们的OR()条件是我期望为真但计算结果为假的地方。
${
${Is-CURRENCY_CD-Empty:equals(true)}
:or(${Is-CURRENCY_CD-NotEmptyAndLen3:equals(true)})
}
理解你的帖子有点困难——可以更清楚一点。
RouteOnAt在某种表达式语言中采用一个或多个动态属性,这些属性必须计算为True或False。
如果动态属性的表达式语言的计算结果为True,则FlowFile将定向到具有动态属性名称的关系。
如果动态属性的表达式语言评估为False,它将尝试下一个动态属性(如果有的话)-如果没有更多的动态属性,并且都返回False,那么FlowFile被发送到不匹配的
关系。
如果您的数据始终为空/空(负)或包含3个字符(正),则无需检查这两个条件-只需检查负或正条件即可。
例如。
一个名为有效
的动态属性,表达式为${CURRENCY_CD: long():equals(3)}
使用此配置,所有CURRENCY_CD
有3个字符的FlowFiles将被路由到有效的
关系。所有没有3个字符的FlowFiles,包括空/空,将被路由到不匹配的
关系。
这样,就会发生以下情况:
CURRENCY_CD
=TRI
转到有效
CURRENCY_CD
=null
转到不匹配
CURRENCY_CD
=测试
将转到无与伦比的
(我们在这里假设这不会出现在您的数据中)
如果您不能保证,并且某些数据可能不符合这两个条件,您可以添加第二个动态属性,名为空
,表达式为${CURRENCY_CD: is空()}
。这将把所有空/空FlowFiles路由到关系空
。
这样,就会发生以下情况:
CURRENCY_CD
=TRI
转到有效
CURRENCY_CD
=null
转到空
CURRENCY_CD
=测试
转到无与伦比的
从你的帖子中很难判断,但是如果空/空和3个字符都是正向条件,并且你想在一个表达式中验证两者,那么你可以将你的表达式简化为:
${CURRENCY_CD:isEmpty():or(${CURRENCY_CD:length():equals(3)})}
这将为空/空或3个字符返回True,并将它们转发到相同的关系。
这样,就会发生以下情况:
CURRENCY_CD
=TRI
转到有效
CURRENCY_CD
=null
转到有效
CURRENCY_CD
=测试
转到无与伦比的