essql聚合结果封装处理
2017-11-30 20:02
267 查看
工作中,由于es原生java api对group的支持不是很友好,特别是group by多个字段聚合时,容易java heap space ,而使用essql则不会。但是使用essql多个group by字段,http返回的结果很复杂,嵌套太多,如果每个sql都带有group by字段,则相应的每个方法都要重写一套特定解析规范,重复造轮子,用了一下午时间,写了一套java版本的essql group by返回结果的封装类,动态适配,避免重复造轮子!有喜欢的,请点赞哈!!!
@Override public Map<String, Object> sqlQuery(String sql) { LinkedHashMap resp = null; try { HttpHeaders headers = new HttpHeaders(); headers.set("Content-Type", "text/plain"); headers.set("Authorization", "Basic enpsb2c6T09vSjNvVlVadDVFeHY="); HttpEntity<String> entity = new HttpEntity<>(sql, headers); resp = restTemplate.postForObject(logUrl, entity, LinkedHashMap.class); } catch (Exception e) { logger.error("LogRestService | sqlQuery | sql={}", sql, e); } return resp; }
/** * Handle the query result * in case of Aggregation query (SQL group by) * * @param resMap */ public static List<Map<String, Object>> aggregationQueryResultHandler(Map<String, Object> resMap) { Map<String, Object> aggregations = (Map<String, Object>) resMap.get("aggregations"); if (MapUtils.isEmpty(aggregations)) { return null; } return getRows(null, aggregations, new HashMap<>()); } private static List<Map<String, Object>> getRows(String bucketName, Map<String, Object> bucket, Map<String, Object> dataMap) { List<Map<String, Object>> rows = new ArrayList<>(); List<Map<String, Object>> subBuckets = getSubBuckets(bucket); if (subBuckets.size() > 0) { subBuckets.forEach(item -> { String subBucketName = (String) item.get("bucketName"); Map<String, Object> subBucket = (Map<String, Object>) item.get("bucket"); Map<String, Object> newDataMap = new HashMap<>(); if (StringUtils.isNotBlank(bucketName)) { newDataMap.put(bucketName, bucket.get("key")); newDataMap.putAll(dataMap); } List<Map<String, Object>> newRows = getRows(subBucketName, subBucket, newDataMap); rows.addAll(newRows); }); } else { Map<String, Object> resultMap = new HashMap<>(); resultMap.putAll(dataMap); if (StringUtils.isNotBlank(bucketName)) { if (bucket.containsKey("key_as_string")) { resultMap.put(bucketName, bucket.get("key_as_string")); } else { resultMap.put(bucketName, bucket.get("key")); } } for (String field : bucket.keySet()) { Object bucketValue = bucket.get(field); if (bucketValue instanceof Map) { Map<String, Object> tempMap = (Map<String, Object>) bucketValue; if (tempMap.containsKey("buckets")) { List<Map<String, Object>> newRows = getRows(null, tempMap, new HashMap<>()); rows.addAll(newRows); continue; } if (tempMap.containsKey("value")) { resultMap.put(field, tempMap.get("value")); } } } if (MapUtils.isNotEmpty(resultMap)) { rows.add(resultMap); } } return rows; } private static List<Map<String, Object>> getSubBuckets(Map<String, Object> bucket) { List<Map<String, Object>> mapList = new ArrayList<>(); for (String field : bucket.keySet()) { Object obj = bucket.get(field); if (obj instanceof Map && ((Map) obj).containsKey("buckets")) { List<Map<String, Object>> subList = (List<Map<String, Object>>) ((Map<String, Object>) obj).get("buckets"); subList.forEach(item -> { Map<String, Object> subMap = new HashMap<>(); subMap.put("bucketName", field); subMap.put("bucket", item); mapList.add(subMap); }); } } return mapList; }
相关文章推荐
- Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,RxJava封装,统一对有无网络处理,异常处理, 返回结果问题
- Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,RxJava封装,统一对有无网络处理,异常处理, 返回结果问题
- 封装springmvc处理ajax请求结果
- 从Object对象中封装了其它对象,怎样取出呢?(Hibernate查询结果处理)
- 对CompletionService封装,实现快速处理业务任务并汇总结果
- Hibernate中使用Criteria接口的Projections类处理聚合结果
- hibernate将本地SQL查询结果封装成对象
- 转:用MapReduce进行数据密集型文本处理 – 本地聚合(上)
- 询问用户是哪个年级的同学,对输入的数据进行保存,将结果显示在屏幕上。要求合法年级为1,2,3.自定义异常类GradeExceptio,对输入非法的情况进行异常处理。
- 新版博客专家实名制处理结果公示:未提供实名的专家将取消专家称号
- 解决三星手机post请求时参数包括集合,封装成JSONObject,结果不是数组而是数组的地址问题
- 用MapReduce进行数据密集型文本处理-本地聚合
- 微信公众帐号开发教程第4篇-消息及消息处理工具的封装
- 单据审批处理时获取提交审批处理的结果
- 配置处理结果---struts2学习笔记
- Hibernate 多表查询结果处理
- Mysql 使用with rollup对聚合结果进行聚合
- jsp中实现一个页面调用另外一个页面所返回的处理结果。
- mybatis 处理结果集对象,对象包含对象[{a,b,c:[{}]}]
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)