hive上的独特计数与elasticsearch

时间:2017-09-15 20:12:15

标签: elasticsearch hive hiveql querydsl elasticsearch-hadoop

我已使用elasticsearch中的elasticsearch-hadoop插件从hive将数据加载到我的elastic群集中。

我需要获取唯一帐号的计数。我在hqlqueryDSL中编写了以下查询,他们返回了不同的计数。

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中的记录数完全相同。

2 个答案:

答案 0 :(得分:1)

  

&#34; Elasticsearch提供的第一个近似聚合是   基数度量
  ...
  如本章顶部所述,基数度量是一个   近似算法。它基于HyperLogLog ++(HLL)   。算法&#34;

     

https://www.elastic.co/guide/en/elasticsearch/guide/current/cardinality.html

对于OP

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"

对于OP,2

  

&#34;我尝试了几个数字......&#34;

您有 71,132 不同的值,而精确阈值限制 40,000 ,因此基数超过阈值,这意味着准确性被交易节省内存。
这就是所选实现(基于HyperLogLog ++算法)的工作原理。

答案 1 :(得分:0)

即使使用 40000 precision_threshold,基数也不能确保准确计数​​。还有另一种方法可以获取字段的准确不同计数。

这篇关于“Accurate Distinct Count and Values from Elasticsearch”的文章详细解释了解决方案以及它对基数的准确性。