Jolt转换咨询:调整列顺序与获取当前时间戳问题
Jolt转换问题解决:调整列顺序与获取当前时间
需求说明
现有单层JSON数据,需完成以下转换:
- 调整字段顺序并转为包含
values对象的Rows数组 - 在
values数组末尾添加格式化后的当前日期时间 - 添加固定默认标签
operationType和Source
样本JSON
{ "name": "john", "Address2": "123 Street 1", "Address1": "Apt 101", "custId": "ZY-1234", "zip": "67834" }
预期JSON
{ "Rows": [{ "values": [ "ZY-1234", "john", "123 Street 1", "Apt 101", "67834", "2022-09-01 10:10:09" ] }], "operationType": "Insert", "Source": "Dev" }
现有Jolt规则
[ { "operation": "default", "spec": { "ChangedBy": "NIFI", "ChangedOn": "${now()}" } }, { "operation": "shift", "spec": { "*": { "@": "Rows[#1].Values" } } }, { "operation": "default", "spec": { "*": { "*": "&" }, "operationType": "Insert", "Source": "Dev" } } ]
当前转换结果
{ "Rows" : [ { "Values" : [ "john", "123 Street 1", "Apt 101", "ZY-1234", "67834", "NIFI", "${now()}" ] } ], "operationType" : "Insert", "Source" : "Dev" }
存在问题
- 如何调整
Values数组中的列顺序? - 如何正确获取并格式化当前日期时间?
解决方案
1. 调整列顺序
原规则使用*通配符会按JSON字段的自然顺序映射,要控制顺序需在shift操作中明确指定每个字段的目标位置,同时统一键名为小写values(匹配预期JSON结构):
- 通过
"字段名": "Rows[0].values[索引]"的格式,按需求顺序依次映射每个字段,索引从0开始递增,确保数组元素顺序完全符合预期。
2. 获取格式化的当前时间
Jolt本身不支持生成时间,若在Apache NiFi环境中使用JoltTransformJSON处理器,可利用NiFi表达式语言格式化当前时间:
- 使用
${now():format('yyyy-MM-dd HH:mm:ss')}生成指定格式的时间字符串 - 通过
modify-overwrite-beta操作将时间插入到values数组的末尾位置
修正后的Jolt规则
[ // 按指定顺序映射字段到Rows数组的values中 { "operation": "shift", "spec": { "custId": "Rows[0].values[0]", "name": "Rows[0].values[1]", "Address2": "Rows[0].values[2]", "Address1": "Rows[0].values[3]", "zip": "Rows[0].values[4]" } }, // 添加顶层默认字段 { "operation": "default", "spec": { "operationType": "Insert", "Source": "Dev" } }, // 将格式化后的当前时间插入到values数组末尾 { "operation": "modify-overwrite-beta", "spec": { "Rows": { "[0]": { "values": { "[5]": "${now():format('yyyy-MM-dd HH:mm:ss')}" } } } } } ]
内容的提问来源于stack exchange,提问作者user10086251
相关产品推荐
相关产品推荐

