如何使用NiFi JoltTransformJSON按条件拼接字段生成Address
该需求完全可以通过JoltTransformJSON实现,你需要组合使用shift、modify-overwrite-beta、remove三类Jolt操作即可,以下是完整可用的spec:
[ { "operation": "shift", "spec": { "*": { "NAME": "[&1].NAME", "CITY": "[&1].tempAddressParts[0]", "PROV": "[&1].tempAddressParts[1]", "POSTALCODE": "[&1].tempPostalCode", "DATE": "[&1].DATE", "TIME": "[&1].TIME" } } }, { "operation": "modify-overwrite-beta", "spec": { "*": { "tempAddressParts": "=recursiveDeref", "tempBaseAddress": "=join(', ', @(1,tempAddressParts))", "tempPostalPart": "=isNull(@(1,tempPostalCode)) ? '' : =concat('Pin: ', @(1,tempPostalCode))", "tempFullAddressArr": "=split(',_$_,', =concat(@(1,tempBaseAddress), ',_$_,', @(1,tempPostalPart)))", "tempFullAddressArr": "=recursiveDeref", "Address": "=join(', ', @(1,tempFullAddressArr))", "Address": "=default(@(1,Address), '')" } } }, { "operation": "remove", "spec": { "*": { "temp*": "" } } } ]
实现逻辑说明
- shift操作阶段:遍历输入数组的每个元素,保留原有NAME、DATE、TIME字段,同时将地址相关的三个字段拆分存入临时变量,方便后续拼接处理。
- modify-overwrite-beta操作阶段:
- 用
recursiveDeref函数清理地址部分的null、空字符串值,避免拼接出多余的逗号 - 先拼接CITY和PROV得到基础地址串
- 对POSTALCODE做非空判断,非空时拼接
Pin:前缀,为空时返回空字符串 - 合并基础地址串和处理后的邮编串,再次清理空值后做最终拼接得到Address字段
- 最后做兜底处理,如果所有地址相关字段都为空,直接将Address设为空字符串
- 用
- remove操作阶段:删除所有前缀为temp的临时变量,输出最终符合要求的结构。
适配验证
该spec适配你给出的两个测试用例,也支持空数组输入:
- Aron条目输出的Address为
NewYork, NY, Pin: 12345,符合预期 - Paul条目因POSTALCODE为null,输出的Address为
Chicago, BI,符合预期 - 若CITY、PROV、POSTALCODE全为空,Address字段自动赋值为空字符串
- 输入为空数组
[]时,输出也为空数组
内容的提问来源于stack exchange,提问作者likeGreen
相关产品推荐
相关产品推荐

