基于null值执行字段重命名移除的JOLT转换方案咨询
JOLT转换配置方案
以下配置可完全覆盖提出的3条转换规则,基于JOLT的shift条件判断实现null值分支逻辑:
- 核心逻辑:优先取
after字段作为final字段的值,仅当after为null时取before字段的值,同时自动移除原始的before/after字段,其余字段完整保留 - 兼容所有场景:after为null、before为null、两个字段都不为null
完整JOLT Spec
[ { "operation": "shift", "spec": { "*": { "payload": { // 透传不需要处理的固定字段 "source": "[&2].payload.source", "op": "[&2].payload.op", "ts_ms": "[&2].payload.ts_ms", "transaction": "[&2].payload.transaction", // 处理after字段分支 "after": { "$": { "null": null, // after为null时直接丢弃 "*": { // after不为null时,将after值写入final字段 "@(2,after)": "[&4].payload.final" } } }, // 处理before字段分支:仅当after为null时才取before值 "before": { "@(1,after)": { "null": { // after为null时,将before值写入final字段 "@": "[&4].payload.final" } } } } } } } ]
转换效果说明
针对给出的输入样例(after为null的场景),按上述规则转换后输出结构为:
[ { "payload": { "source": { "file": "delta.000002", "pos": 8362, "row": 0, "thread": null, "query": null }, "op": "c", "ts_ms": 1654851760103, "transaction": null, "final": { "order_id": 3110445250, "data": "2022-06-10", "ora": "08:08:00", "test1": "2022-06-10T00:00:00.000Z", "test2": "2022-06-10T03:00:00.000Z" } } } ]
注:如果实际需求不需要重命名为
final,仅需移除值为null的before/after字段、保留非null字段的原始名称(和给出的期望输出结构完全一致),只需要将上述spec中所有[&N].payload.final路径改为对应原字段名即可:after非null时路径改为[&4].payload.after,after为null时路径改为[&4].payload.before。
其他场景兼容
- 输入
before为null、after有值时:自动移除null的before字段,将after值写入final - 输入
before和after都有值时:自动移除before字段,将after值写入final
内容的提问来源于stack exchange,提问作者Cristi Ciucu
相关产品推荐
相关产品推荐

