NiFi中如何将JSON文件内的epoch时间转换为指定格式时间戳
问题根因
两类异常均为配置不符合处理器运行规则导致:
- 原始
createTime值是13位毫秒级epoch时间戳,无需额外乘1000或拼接000。Jolt配置里的append('000')会把数值转成16位字符串,时间解析溢出后直接返回1970纪元初始时间。 - UpdateRecord抛出
NumberFormatException是因为字段类型不匹配:createTime默认按数值类型处理,直接写入格式化后的时间字符串时,处理器会尝试把字符串反向解析为数值,必然触发类型转换错误。
可行配置方案
方案1:UpdateRecord(兼容性最好,优先选择)
按以下步骤调整配置:
- 将Record Reader/Writer关联的Schema中
createTime字段类型修改为string,如果使用自动推断Schema,直接在Writer配置里开启字段类型覆盖即可。 Replacement Value Strategy设置为Record Path Value- 新增动态属性:
- 属性名:
/createTime - 属性值:
${field.value:toNumber():format("yyyy-MM-dd HH:mm:ss.SSS", "GMT")}
时区参数按需替换,例如东八区填
Asia/Shanghai,美东时间填America/New_York,匹配你预期的3:34:03输出即可。 - 属性名:
- 不要额外添加
multiply(1000)或字符串拼接逻辑,原始毫秒级时间戳可直接传入format函数解析。
方案2:JoltTransformation
注意不要直接在shift规则里写NiFi表达式,低版本NiFi不支持该用法,使用modify规则链配置:
- Jolt Transform DSL选择
chain模式 - 转换规则填入以下内容:
[ { "operation": "modify-overwrite-beta", "spec": { "createTime": "${createTime:toNumber():format('yyyy-MM-dd HH:mm:ss.SSS', 'GMT')}" } } ]
如果配置后仍然输出1970年时间,说明当前NiFi版本的Jolt处理器不支持在转换规则中直接执行EL时间函数,直接换用UpdateRecord方案即可。
结果验证
传入测试数据{"createTime": 1510932843000},匹配对应时区参数后即可得到预期的2017-11-17 3:34:03.000输出。
内容的提问来源于stack exchange,提问作者Maykid
相关产品推荐
相关产品推荐

