You need to enable JavaScript to run this app. 如何在Hazelcast Jet中基于最大日期过滤BatchStage结果
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hazelcast Jet中基于最大日期过滤BatchStage结果

基于最大日期过滤BatchStage输出的实现方案

核心改动思路是在构造TestModel实例的环节,提前对value对应的原始观测集合做过滤,只保留单条最大日期的记录,适配现有代码结构的同时不需要改动TestModel本身的类定义。

具体实现步骤

  • 提前定义和当前日期格式匹配的解析器,避免直接对日期字符串做比较出现排序错误
  • 对每个json节点取出的json_obs集合做流式处理,将每条记录的日期转成可比较的日期对象后,筛选出日期最大的单条记录
  • 将筛选出的单条记录包装为集合类型,和TestModel原有value字段的结构保持一致,避免类型不兼容问题

改写后的代码示例

原有实现代码:

BatchStage<TestModel> testModel = value.map(model -> JsonUtil.mapFrom(model.getObject_value()))
        .map(json -> new TestModel(json.get("id"), json.get("json_obs")));

加入过滤逻辑后的完整代码:

// 匹配当前dd/MM/yyyy格式的日期解析器
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

BatchStage<TestModel> testModel = value.map(model -> JsonUtil.mapFrom(model.getObject_value()))
        .map(json -> {
            // 取出原始观测记录集合
            List<Map<String, String>> originalObs = (List<Map<String, String>>) json.get("json_obs");
            // 筛选出日期最大的单条记录
            Map<String, String> maxDateObs = originalObs.stream()
                    .max(Comparator.comparing(obs -> LocalDate.parse(obs.get("date"), dateFormatter)))
                    // 可根据业务需求替换异常处理逻辑,比如空集合返回空列表
                    .orElseThrow(() -> new RuntimeException("观测记录缺失,无法完成日期比较"));
            // 包装为单元素列表,和原value字段的集合结构保持一致
            List<Map<String, String>> filteredValue = Collections.singletonList(maxDateObs);
            return new TestModel(json.get("id"), filteredValue);
        });

关键注意事项

  • 禁止直接对日期字符串做字典序排序:当前日期格式为"dd/MM/yyyy",直接对比字符串会出现类似"02/04/2021"排在"10/03/2021"之前的排序错误,必须先将字符串解析为日期类型再做比较。
  • 保持字段结构一致:TestModel的value字段原本存储的是集合类型,过滤后不能直接传入单个Map实例,否则会触发类型转换异常。
  • 适配边界场景:如果部分key对应的json_obs集合为空,可根据业务逻辑调整空值处理规则,比如跳过空记录或返回空集合而非直接抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 13:24:03