You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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"
          }
        }
      }
    }
  }
]

转换逻辑说明

  1. 分组收集:以path作为键,将同目录下的文件名和路径聚合到对应分组中。
  2. 统计数量:使用size函数计算每个分组的文件总数,生成cnt字段。
  3. 拆分并添加索引:遍历每个分组的文件列表,将每个文件拆分为独立条目,同时携带分组的path和cnt,并通过$+1生成从1开始的序号id。

内容的提问来源于stack exchange,提问作者Alan M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:59:56