如何编写Jolt Spec实现按目录统计并索引文件列表?
请问如何编写Jolt Spec以按目录对文件列表进行统计并添加索引?
输入JSON
[ { "path": "/test/2007-07-02", "filename": "datafile_00001.parquet" }, { "path": "/test/2007-07-03", "filename": "datafile_00005.parquet" }, { "path": "/test/2007-07-03", "filename": "datafile_00014.parquet" } ]
现有JOLT转换步骤
- 匹配任意path值,向上遍历3层树结构,获取整个数组元素并写入输出数组
- 对数据进行分组
- 将映射转换为顶级列表
- 统计“files”数量
现有JOLT转换代码
[ { "operation": "shift", "spec": { "*": { "path": { "*": { "@(3,[&2])": "&.[]" } } } } }, { "operation": "shift", "spec": { "*": { "$": "&.path", "*": { "filename": "&2.files[]" } } } }, { "operation": "shift", "spec": { "*": "[#1]" } }, { "operation": "modify-overwrite-beta", "spec": { "*": { "cnt": "=size(@(1,files))" } } } ]
期望输出
[ { "path": "/test/2007-07-02", "filename": "datafile_00001.parquet", "id": 1, "cnt": 1 }, { "path": "/test/2007-07-03", "filename": "datafile_00005.parquet", "id": 1, "cnt": 2 }, { "path": "/test/2007-07-03", "filename": "datafile_00014.parquet", "id": 2, "cnt": 2 } ]
当前输出
[ { "path": "/test/2007-07-02", "files": [ "datafile_00001.parquet" ], "cnt": 1 }, { "path": "/test/2007-07-03", "files": [ "datafile_00005.parquet", "datafile_00014.parquet" ], "cnt": 2 } ]
修改后的JOLT Spec
[ // 按path分组,收集文件名与路径 { "operation": "shift", "spec": { "*": { "path": { "@(1,filename)": "&1.files[]", "@(1,path)": "&1.path" } } } }, // 计算每个目录的文件总数 { "operation": "modify-overwrite-beta", "spec": { "*": { "cnt": "=size(@(1,files))" } } }, // 拆分文件条目,添加序号id并携带目录信息 { "operation": "shift", "spec": { "*": { "files": { "*": { "@(2,path)": "[#2].path", "@": "[#2].filename", "@(2,cnt)": "[#2].cnt", "$+1": "[#2].id" } } } } } ]
转换逻辑说明
- 分组收集:以
path作为键,将同目录下的文件名和路径聚合到对应分组中。 - 统计数量:使用
size函数计算每个分组的文件总数,生成cnt字段。 - 拆分并添加索引:遍历每个分组的文件列表,将每个文件拆分为独立条目,同时携带分组的
path和cnt,并通过$+1生成从1开始的序号id。
内容的提问来源于stack exchange,提问作者Alan M
相关产品推荐
相关产品推荐

