使用表达式语言的 apache nifi 中的布尔条件评估没有意义
Boolean condition evaluation in apache nifi using expression language doesnt make sense
我是 apache nifi 表达式语言的新手。我需要根据该验证流文件属性值和路由。
这是我的要求。
更新:
详细要求:
- Nifi 工作流将读取 json/csv 数据并一次处理每条记录。目前,我们正在考虑 json 格式的输入数据。
- 每个 json object 都有属性,因为(我已经删除了一些其他属性,这些属性对于我的 question/this 主题 )
{
"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"
}
使用“EvaluateJsonPath”处理器,我将 json 属性读入流文件属性。
一个名为 CURRENCY_CD 的属性,它可以是 NULL/empty 或者如果它不为空,那么它的长度应该是 3 个字符 --> 这是其中之一关键要求(用于验证传入数据)。
所以有效数据用例是 CURRENCY_CD 可以是 null、空或任何 3 个字符的字符串。该 attr 的任何其他值都被视为无效输入数据和记录处理器流的路由。
我正在使用“UpdateAttribute”处理器使用表达式语言查询评估一些逻辑并将它们存储在流文件属性下。
我想出了以下逻辑来验证 CURRENCY_CD 要求:
${
${CURRENCY_CD:isEmpty()}
:or(${CURRENCY_CD:isEmpty():not():and(${CURRENCY_CD:length():equals(3)})})
}
然后我使用“RouteOnAttribute”处理器检查此属性的值并相应地路由到无效流(用于记录)或传递传入数据以进一步处理工作流阶段。
输入数据:
现在,当我在 json 中将输入数据作为空字符串提供时,我希望它是 TRUE。但它总是以 FALSE 结束。我在这里做错了什么?
输入样本#1
{
"CURRENCY_CD": ""
}
输入样本#2
{
"CURRENCY_CD": null
}
对于这些值中的任何一个,空字符串或 null,nifi 将具有值的相应属性标记为“空字符串集”。
如果我尝试将此逻辑分解为多个属性以分别检查表达式布尔条件,它的计算结果是正确的。将它们组合起来的 Or() 条件是我期望为真的地方,但它的计算结果为假。
然后,我也尝试这样使用,
${
${Is-CURRENCY_CD-Empty:equals(true)}
:or(${Is-CURRENCY_CD-NotEmptyAndLen3:equals(true)})
}
并将其存储在属性“Is_CurrencyCode_Valid”中并期望它为真,但反过来,它带有假。
有点难以理解您的 post - 可以更清楚一点。
RouteOnAttribute takes one or more Dynamic Properties with some Expression Language 必须评估为 True 或 False。
如果动态 属性 的表达式语言计算结果为 True,则 FlowFile 被定向到与动态 属性.
名称的关系
如果 Dynamic 属性 的表达式语言评估为 False,它将尝试下一个 Dynamic 属性(如果有的话)- 如果没有更多的 Dynamic Properties,并且所有returned False,然后将 FlowFile 发送到 unmatched
关系。
如果您的数据 总是 null/empty(负)或包含 3 个字符(正),则无需检查这两种情况 - 只需检查负面或正面条件。
例如
一个动态 属性 调用了 valid
,表达式为 ${CURRENCY_CD:length():equals(3)}
使用此配置,CURRENCY_CD
具有 3 个字符的所有 FlowFiles 将被路由到 valid
关系。所有 不 有 3 个字符的 FlowFiles,包括 null/empty,将被路由到 unmatched
关系。
这样,将发生以下情况:
CURRENCY_CD
= TRI
转到 valid
CURRENCY_CD
= null
转到 unmatched
CURRENCY_CD
= testing
转到 unmatched
(我们在这里假设这不会出现在您的数据中)
如果您不能保证并且某些数据可能不属于这 2 个条件,您可以添加第二个名为 empty
的动态 属性,表达式 ${CURRENCY_CD:isEmpty()}
。这会将所有 null/empty FlowFiles 路由到关系 empty
.
这样,将发生以下情况:
CURRENCY_CD
= TRI
转到 valid
CURRENCY_CD
= null
转到 empty
CURRENCY_CD
= testing
转到 unmatched
很难从你的 post 看出,但如果 empty/null 和 3 个字符都是肯定条件,并且你想在一个表达式中验证这两个,那么你可以将你的表达式简化为:
${CURRENCY_CD:isEmpty():or(${CURRENCY_CD:length():equals(3)})}
return 对 empty/null 或 3 个字符都为真,并将它们转发到相同的关系。
这样,将发生以下情况:
CURRENCY_CD
= TRI
转到 valid
CURRENCY_CD
= null
转到 valid
CURRENCY_CD
= testing
转到 unmatched
我是 apache nifi 表达式语言的新手。我需要根据该验证流文件属性值和路由。
这是我的要求。
更新: 详细要求:
- Nifi 工作流将读取 json/csv 数据并一次处理每条记录。目前,我们正在考虑 json 格式的输入数据。
- 每个 json object 都有属性,因为(我已经删除了一些其他属性,这些属性对于我的 question/this 主题 )
{
"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"
}
使用“EvaluateJsonPath”处理器,我将 json 属性读入流文件属性。
一个名为 CURRENCY_CD 的属性,它可以是 NULL/empty 或者如果它不为空,那么它的长度应该是 3 个字符 --> 这是其中之一关键要求(用于验证传入数据)。
所以有效数据用例是 CURRENCY_CD 可以是 null、空或任何 3 个字符的字符串。该 attr 的任何其他值都被视为无效输入数据和记录处理器流的路由。
我正在使用“UpdateAttribute”处理器使用表达式语言查询评估一些逻辑并将它们存储在流文件属性下。
我想出了以下逻辑来验证 CURRENCY_CD 要求:
${ ${CURRENCY_CD:isEmpty()} :or(${CURRENCY_CD:isEmpty():not():and(${CURRENCY_CD:length():equals(3)})}) }
然后我使用“RouteOnAttribute”处理器检查此属性的值并相应地路由到无效流(用于记录)或传递传入数据以进一步处理工作流阶段。
输入数据: 现在,当我在 json 中将输入数据作为空字符串提供时,我希望它是 TRUE。但它总是以 FALSE 结束。我在这里做错了什么?
输入样本#1
{
"CURRENCY_CD": ""
}
输入样本#2
{
"CURRENCY_CD": null
}
对于这些值中的任何一个,空字符串或 null,nifi 将具有值的相应属性标记为“空字符串集”。
如果我尝试将此逻辑分解为多个属性以分别检查表达式布尔条件,它的计算结果是正确的。将它们组合起来的 Or() 条件是我期望为真的地方,但它的计算结果为假。
然后,我也尝试这样使用,
${
${Is-CURRENCY_CD-Empty:equals(true)}
:or(${Is-CURRENCY_CD-NotEmptyAndLen3:equals(true)})
}
并将其存储在属性“Is_CurrencyCode_Valid”中并期望它为真,但反过来,它带有假。
有点难以理解您的 post - 可以更清楚一点。
RouteOnAttribute takes one or more Dynamic Properties with some Expression Language 必须评估为 True 或 False。
如果动态 属性 的表达式语言计算结果为 True,则 FlowFile 被定向到与动态 属性.
名称的关系如果 Dynamic 属性 的表达式语言评估为 False,它将尝试下一个 Dynamic 属性(如果有的话)- 如果没有更多的 Dynamic Properties,并且所有returned False,然后将 FlowFile 发送到 unmatched
关系。
如果您的数据 总是 null/empty(负)或包含 3 个字符(正),则无需检查这两种情况 - 只需检查负面或正面条件。
例如
一个动态 属性 调用了 valid
,表达式为 ${CURRENCY_CD:length():equals(3)}
使用此配置,CURRENCY_CD
具有 3 个字符的所有 FlowFiles 将被路由到 valid
关系。所有 不 有 3 个字符的 FlowFiles,包括 null/empty,将被路由到 unmatched
关系。
这样,将发生以下情况:
CURRENCY_CD
= TRI
转到 valid
CURRENCY_CD
= null
转到 unmatched
CURRENCY_CD
= testing
转到 unmatched
(我们在这里假设这不会出现在您的数据中)
如果您不能保证并且某些数据可能不属于这 2 个条件,您可以添加第二个名为 empty
的动态 属性,表达式 ${CURRENCY_CD:isEmpty()}
。这会将所有 null/empty FlowFiles 路由到关系 empty
.
这样,将发生以下情况:
CURRENCY_CD
= TRI
转到 valid
CURRENCY_CD
= null
转到 empty
CURRENCY_CD
= testing
转到 unmatched
很难从你的 post 看出,但如果 empty/null 和 3 个字符都是肯定条件,并且你想在一个表达式中验证这两个,那么你可以将你的表达式简化为:
${CURRENCY_CD:isEmpty():or(${CURRENCY_CD:length():equals(3)})}
return 对 empty/null 或 3 个字符都为真,并将它们转发到相同的关系。
这样,将发生以下情况:
CURRENCY_CD
= TRI
转到 valid
CURRENCY_CD
= null
转到 valid
CURRENCY_CD
= testing
转到 unmatched