JAVA hbase groupby_Elasticsearch JAVA api轻松搞定groupBy聚合

本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合。

为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group by field1, field2, ...);如果你需要多级的groupby,在实现上可能需要拆分的更加细致。

即将给出的方法,适用于如下的场景:

场景1:找出分组中的所有桶,例如,select group_name from index_name group by group_name;

场景2:灵活添加一个或者多个聚合函数,例如,select group_name, max(count), avg(count) group by group_name;

1、用法

GroupBy类是我们的实现。

1)测试用例

public static void main(String[] args) {

/*

* 初始化es客户端

* */

ESClient esClient = new ESClient(

"dqa-cluster",

"10.93.21.21:9300,10.93.18.34:9300,10.93.18.35:9300,100.90.62.33:9300,100.90.61.14:9300",

false);

/*

* 为了演示, 构造了一个距离查询, 相当于where子句.

* */

GeoDistanceRangeQueryBuilder queryBuilder = QueryBuilders.geoDistanceRangeQuery("location")

.point(39.971424, 116.398251)

.from("0m")

.to(String.format("%fm", 500.0))

.includeLower(true)

.includeUpper(true)

.optimizeBbox("memory")

.geoDistance(GeoDistance.SLOPPY_ARC);

SearchRequestBuilder search = esClient.getClient().prepareSearch("moon").setTypes("bj")

.setSearchType(SearchType.DFS_QUERY_AND_FETCH)

.setQuery(queryBuilder);

/*

* GroupBy类就是我们的实现, 初始化的时候传入的参数依次是, search, 桶命名, 分桶字段, 排序asc

* select date as date_group from index group by date;

* */

GroupBy groupBy = new GroupBy(search, "date_group", "date", true);

/*

* 添加各种分组函数

* 这里我实现了10种, 下面是其中的6种

* */

groupBy.addSumAgg("pre_total_fee_sum", "pre_total_fee");

groupBy.addAvgAgg("pre_total_fee_avg", "pre_total_fee");

groupBy.addPercentilesAgg("pre_total_fee_percent", "pre_total_fee");

groupBy.addPercentileRanksAgg("pre_total_fee_percentRank", "pre_total_fee", new double[]{13, 16, 20});

groupBy.addStatsAgg("pre_total_fee_stats", "pre_total_fee");

groupBy.addCardinalityAgg("type_card", "type");

/*

* 获取groupBy聚合的结果

* 结果是两级Map, 这里的实现是TreeMap因为要保护桶的排序

* */

Map groupbyResponse = groupBy.getGroupbyResponse();

for (Map.Entry entry : groupbyResponse.entrySet()) {

String bucketKey = entry.getKey();

Map subAggMap = (Map) entry.getValue();

System.out.println(String.format("%s\t%s\t%s", bucketKey, "pre_total_fee_sum", subAggMap.get("pre_total_fee_sum")));

System.out.println(String.format("%s\t%s\t%s", bucketKey, "pre_total_fee_avg", subAggMap.get("pre_total_fee_avg")));

System.out.println(String.format("%s\t%s\t%s", bucketKey, "pre_total_fee_percent", subAggMap.get("pre_total_fee_percent")));

System.out.println(String.format("%s\t%s\t%s", bucketKey, "pre_total_fee_percentRank", subAggMap.get("pre_total_fee_percentRank")));

System.out.println(String.format("%s\t%s\t%s", bucketKey, "pre_total_fee_stats", subAggMap.get("pre_total_fee_stats")));

System.out.println(String.format("%s\t%s\t%s", bucketKey, "type_card", subAggMap.get("type_card")));

}

}

2)初始化

初始化的时候,相当于构造了这样一个SQL:select date as date_group from index group by date;

传入search对象,相当于where子句

传入分桶命名, 相当于 as date_group

传入分桶字段,相当于date

传入排序,asc=true

3)初始化完成后,可以添加各种聚合函数,也就是场景2。

Group

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值