基于来源统计文件数量并分组的Jolt转换技术咨询
Jolt转换方案:按来源统计文件数量并列出文件
需求
按来源统计文件数量并列出对应文件。
输入数据
[ { "filename": "FF/raw/first/raw_A/filenameA_20240212002113.DAT" }, { "filename": "FF/raw/first/raw_A/filenameA__20240205150101.DAT" }, { "filename": "FF/raw/first/raw_B/filenameB_20240212002113.DAT" }, { "filename": "FF/raw/first/raw_B/filenameB_20240205150101.DAT" } ]
期望输出
[ { "Source": "raw_A", "Filecount": 2,// 对应FileName数组的文件数量 "FileName": [ "filenameA_20240212002113.DAT", "filenameA_20240205150101.DAT" ] }, { "Source": "raw_B", "Filecount": 2, "FileName": [ "filenameB_20240212002113.DAT", "filenameB_20240205150101.DAT" ] } ]
尝试过的Jolt Spec(未得到预期结果)
[ { "operation": "shift", "spec": { "*": { "*": { "*/*/*/*/*": "Source:&(0,4):filecount:: Filename.&(0,5)" // 尝试用第5个星号提取叶子节点 } } } }, { "operation": "shift", "spec": { "*": { "*": { "$": "&2.[#2]" } } } }, { "operation": "modify-overwrite-beta", "spec": { "*": { "Filecount": "=size(@(1,&filename))" } } }, { "operation": "shift", "spec": { "*": { "*": "[#2].&1" } } } ]
正确的Jolt转换方案
以下是实现需求的Jolt Spec:
[ // 第一步:按来源分组,提取文件名 { "operation": "shift", "spec": { "*": { "filename": { // 拆分路径,用&(0,4)获取第4段(raw_A/raw_B),&(0,5)获取文件名 "*/*/*/*/*": { "$(0,5)": "&(0,4).FileName[]", "@(0,4)": "&(0,4).Source" } } } } }, // 第二步:计算每个来源的文件数量 { "operation": "modify-overwrite-beta", "spec": { "*": { "Filecount": "=size(@(1,FileName))" } } }, // 第三步:将分组后的对象转为数组 { "operation": "shift", "spec": { "*": "[]" } } ]
转换步骤说明
- Shift操作(分组提取):遍历每个文件,拆分
filename路径,把文件名归类到对应来源的FileName数组,同时记录Source字段。 - Modify操作(统计数量):对每个来源,用
size函数计算FileName数组的长度,赋值给Filecount。 - Shift操作(转数组):将以来源名为键的对象结构转换为期望的数组格式。
内容的提问来源于stack exchange,提问作者Manimaran Dhandapani
相关产品推荐
相关产品推荐

