我已使用elasticsearch
中的elasticsearch-hadoop
插件从hive将数据加载到我的elastic
群集中。
我需要获取唯一帐号的计数。我在hql
和queryDSL
中编写了以下查询,但他们返回了不同的计数。
Hive Query:
select count(distinct account) from <tableName> where capacity="550";
// Returns --> 71132
同样,在Elasticsearch中,查询如下所示:
{
"query": {
"bool": {
"must": [
{"match": { "capacity": "550"}}
]
}
},
"aggs": {
"unique_account": {
"cardinality": {
"field": "account"
}
}
}
}
// Returns --> 71607
我做错了吗?我该怎么做才能匹配这两个查询?
Note:
hive和elasticsearch中的记录数完全相同。
答案 0 :(得分:1)
&#34; Elasticsearch提供的第一个近似聚合是 基数度量
...
如本章顶部所述,基数度量是一个 近似算法。它基于HyperLogLog ++(HLL) 。算法&#34;https://www.elastic.co/guide/en/elasticsearch/guide/current/cardinality.html
precision_threshold
&#34; precision_threshold接受0-40,000之间的数字。更大的价值观 相当于40,000 ...
虽然没有保证 算法,如果基数低于阈值,则差不多 总是100%准确。超过此基数将开始交易 内存节省的准确性,一点点错误将蔓延到 。度量&#34;https://www.elastic.co/guide/en/elasticsearch/guide/current/cardinality.html
您可能还想查看"Support for precise cardinality aggregation #15876"
&#34;我尝试了几个数字......&#34;
您有 71,132 不同的值,而精确阈值限制 40,000 ,因此基数超过阈值,这意味着准确性被交易节省内存。
这就是所选实现(基于HyperLogLog ++算法)的工作原理。
答案 1 :(得分:0)
即使使用 40000 precision_threshold,基数也不能确保准确计数。还有另一种方法可以获取字段的准确不同计数。
这篇关于“Accurate Distinct Count and Values from Elasticsearch”的文章详细解释了解决方案以及它对基数的准确性。