elasticsearch2.x中es-sql的distinct字段和原生的cardinality使用及适用场景

场景:

        用户通过数据集dataset分组,并通过event_no字段去重进行数据去重后统计。

使用es-sql实现等价去重查询:

SELECT dataset,count(DISTINCT event_no) as count from json_archives_qc/info group by dataset

为什么我要说类似等价呢? 因为从精确性、性能等角度还是和普通sql有很大区别的~!!!

使用cardinality聚合函数(只支持40000以内统计结果的精确度

dsl:

{
	"from": 0,
	"size": 0,
	"fields": "dataset",
	"aggregations": {
		"dataset": {
			"terms": {
				"field": "dataset",
				"size": 200
			},
			"aggregations": {
				"count": {
					"cardinality": {
						"field": "event_no",
						"precision_threshold": 40000
					}
				}
			}
		}
	}
}

详细代码:

        SearchRequestBuilder builder = transportClient.prepareSearch("json_archives_qc");
            builder.setTypes("info");
            builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
            AggregationBuilder terms = AggregationBuilders.terms("dataset").field("dataset").size(200);
            CardinalityBuilder childTerms = AggregationBuilders.cardinality("count").field("event_no").precisionThreshold(40000);
            terms.subAggregation(childTerms);
            builder.addAggregation(terms);
            builder.setSize(0);
            builder.setFrom(0);
            SearchResponse response = builder.get();
            StringTerms longTerms = response.getAggregations().get("dataset");
            for (Terms.Bucket item : longTerms.getBuckets()) {
                InternalCardinality extendedStats = item.getAggregations().get("count");
                Map<String, Object> temp = new HashMap<>();
                temp.put("dataset", item.getKeyAsString());
                temp.put("count", extendedStats.getValue());
                resultList.add(temp);
                num1 += extendedStats.getValue();
            }

主要代码:InternalCardinality extendedStats = item.getAggregations().get("count"); //获取去重过滤后的统计结果;  需要使用InternalCardinality 进行获取数据, 之前直接通过item.getAggregations().get("count") 去获取去重后结果,一直无法获取成功;

  优点:性能快,亿级别的记录在1秒内完成

  缺点:返回结果只能保证最大40000条记录的精确,统计结果超过40000的话会存在5%的误差,不适合需要精确去重场景

精度要求场景:

未研究哈,后续继续研究下,有问题的同学可以留言互相探讨

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值