提问者:小点点

使用表达式语言在apache nifi中进行布尔条件评估没有意义


我是apache nifi、表达式语言的新手。我需要在此基础上验证流文件属性值和路由。

这是我的要求。

更新:详细要求:

  • Nifi工作流将读取json/csv数据并一次处理每条记录。目前,我们正在考虑json格式的输入数据。
  • 每个json对象都将具有attrs as(我已经删除了一些对我的问题/本主题不必要的其他attrs)
{
    "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)})
    }
    


  • 共1个答案

    匿名用户

    理解你的帖子有点困难——可以更清楚一点。

    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=测试转到无与伦比的