配置单元上的不同计数与elasticsearch上的基数计数不匹配

doinxwow  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(323)

我已将数据加载到 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中的记录数完全相同。

dzjeubhm

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++算法)的工作原理。

相关问题