如何在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
相关产品推荐
相关产品推荐

