您当前的位置: 首页 >  ar

Dongguo丶

暂无认证

  • 6浏览

    0关注

    472博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

49深入聚合数据分析_cardinality算法之优化内存开销以及HLL算法

Dongguo丶 发布时间:2021-11-29 07:57:40 ,浏览量:6

cardinality=count(distinct),5%的错误率,性能在100ms左右,如何对cardinality进行优化呢?

1、precision_threshold优化准确率和内存开销
GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand",
              "precision_threshold" : 100 
            }
        }
    }
}

brand去重,如果brand的unique value,在100个以内,小米,长虹,三星,TCL,HTL。。。

在多少个unique value以内,cardinality,几乎保证100%准确 cardinality算法,会占用precision_threshold * 8 byte 内存消耗,100 * 8 = 800个字节 占用内存很小。。。而且unique value如果的确在值以内,那么可以确保100%准确,数百万的unique value,那么错误率在5%以内

precision_threshold,值设置的越大,占用内存越大,1000 * 8 = 8000 / 1000 = 8KB,可以确保更多unique value的场景下,100%的准确

对field去重取count,这时候unique value有10000,precision_threshold=10000,10000 * 8 = 80000个byte,80KB,可以保证10000 个unique value 是 100%的准确

2、HyperLogLog++ (HLL)算法性能优化

cardinality底层算法:HLL算法,

HLL算法的性能

会对所有的uqniue value取hash值,通过hash值近似去求distcint count,有误差

默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,取hash值; 将取hash值的操作,前移到建立索引的时候

建立索引

PUT /tvs/
{
  "mappings": {
    "sales": {
      "properties": {
        "brand": {
          "type": "text",
          "fields": {
            "hash": {
              "type": "murmur3" 
            }
          }
        }
      }
    }
  }
}

cardinality基于brand.hash使用murmur3方法进行hash

GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand.hash",
              "precision_threshold" : 100 
            }
        }
    }
}
关注
打赏
1638062488
查看更多评论
立即登录/注册

微信扫码登录

0.0355s