我已将数据加载到 elasticsearch
使用 elasticsearch-hadoop
插件来自 elastic
.
我需要取一个独特的帐号计数。我用这两种语言编写了以下查询 hql
以及 queryDSL
,但他们返回了不同的计数。
配置单元查询:
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中的记录数完全相同。
1条答案
按热度按时间dzjeubhm1#
elasticsearch提供的第一个近似聚合是基数度量
...
如本章顶部所述,基数度量是一种近似算法。它基于hyperloglog++(hll)算法。”
https://www.elastic.co/guide/en/elasticsearch/guide/current/cardinality.html
为了这次行动
精度\u阈值
“精度阈值接受0–40000之间的数字。较大的值被视为等于40000。
...
虽然算法不能保证,但如果基数低于阈值,它几乎总是100%准确。高于此值的基数将开始以精度换取内存节省,一点小错误将蔓延到度量中。”
https://www.elastic.co/guide/en/elasticsearch/guide/current/cardinality.html
您可能还想看看“支持精确基数聚合35876”
为了行动,2
“我试过几个号码……”
您有71132个不同的值,而精度阈值限制是40000,因此基数超过了阈值,这意味着用精度换取内存节省。
这就是所选实现(基于hyperloglog++算法)的工作原理。