essql聚合结果封装处理
来源:互联网 发布:华南师大网络教育 编辑:程序博客网 时间:2024/06/05 02:28
工作中,由于es原生java api对group的支持不是很友好,特别是group by多个字段聚合时,容易java heap space ,而使用essql则不会。但是使用essql多个group by字段,http返回的结果很复杂,嵌套太多,如果每个sql都带有group by字段,则相应的每个方法都要重写一套特定解析规范,重复造轮子,用了一下午时间,写了一套java版本的essql group by返回结果的封装类,动态适配,避免重复造轮子!有喜欢的,请点赞哈!!!
@Overridepublic 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;}
阅读全文
1 0
- essql聚合结果封装处理
- Hibernate处理聚合函数SQL结果集
- 数据库 SUM + AVG 等聚合函数 结果为NULL 处理
- jdbc的简单封装(使用map处理结果集)
- elasticsearch选择器聚合,分组返回聚合结果
- Hibernate中使用Criteria接口的Projections类处理聚合结果
- 4.3 ForkJoin_聚合任务结果
- ElasticSearch格式化管道聚合结果
- 封装 、继承、多态、组合、聚合
- 封装resultset 结果集
- 封装数据结果集
- golang封装结果集
- 接口结果的封装
- Mysql 使用with rollup对聚合结果进行聚合
- 从Object对象中封装了其它对象,怎样取出呢?(Hibernate查询结果处理)
- 对CompletionService封装,实现快速处理业务任务并汇总结果
- Elasticsearch里面聚合group结果不正确
- 21.2 匹配结果处理
- Xshell5配置ssh免密码登录-公钥与私钥登录linux服务器(xshell如何登陆上阿里云服务器)
- 神操作
- BFPRT算法——在一个无序数组找出前k小的数
- 使用vue框架手动创建导航栏
- 获取本地时间与UTC时间
- essql聚合结果封装处理
- 【Scikit-Learn 中文文档】聚类
- ACdream
- Programming Elastic MapReduce.pdf 英文原版 免费下载
- 五种简单工厂模式
- 机房重构总结2
- 交换机和路由器的区别
- Linux(CentOS) 下安装 Nginx
- 百度地图点聚合缩放,label标签消失