JOLT动态JSON键时间戳转Epoch:缺失字段报错原因咨询
问题原因
问题出在你写的JOLT Spec里——当FlowFile里没有assign、i_date这类指定字段时,NiFi表达式${assign:toDate(...)}找不到对应的字段值,直接触发表达式求值失败,导致JOLT组件报错。因为NiFi的表达式语言没法对不存在的字段执行toDate这类操作。
解决方案
修改JOLT Spec,给每个字段添加存在性判断,仅当字段存在时才执行时间转换,不存在则跳过该字段的处理。借助NiFi表达式语言的exists()和ifElse()函数就能实现:
修改后的Jolt Spec
[ { "operation": "modify-overwrite-beta", "spec": { "assign": "${assign:exists():ifElse(${assign:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}", "updated_on": "${updated_on:exists():ifElse(${updated_on:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}", "i_date": "${i_date:exists():ifElse(${i_date:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}", "created_on": "${created_on:exists():ifElse(${created_on:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}" } }, { "operation": "remove", "spec": { "*": "null" } } ]
逻辑说明
- 存在性校验:
${field:exists():ifElse(转换逻辑, null)}会先检查字段是否存在,存在就执行时间转Epoch的操作,不存在则设为null - 清理空字段:新增的
remove操作会过滤掉所有值为null的字段,确保最终输出只包含原本存在且转换成功的时间字段,和你期望的结果一致。
测试验证
用你提供的输入JSON测试:
输入
{ "updated_on": "2023-03-14 03:56:22", "created_on": "2023-03-14 03:56:22" }输出
{ "updated_on": 1678766182, "created_on": 1678766182 }
(如果需要Epoch时间为字符串类型,可在toNumber()后追加:toString(),即${field:toDate(...):toNumber():toString()})
补充方案(可选)
如果不想依赖JOLT的remove操作,也可以在EvaluateJsonPath组件里先提取所有存在的时间字段,再传递给JOLT处理,但上面的单JOLT组件方案更简洁高效。
内容的提问来源于stack exchange,提问作者self lab
相关产品推荐
相关产品推荐

