白话Elasticsearch47-深入聚合数据分析之Cardinality Aggs-cardinality算法之优化内存开销以及HLL算法
文章目錄
- 概述
- 官方說(shuō)明
- precision_threshold優(yōu)化準(zhǔn)確率和內(nèi)存開(kāi)銷(xiāo)
- HyperLogLog++ (HLL)算法性能優(yōu)化
概述
繼續(xù)跟中華石杉老師學(xué)習(xí)ES,第47篇
課程地址: https://www.roncoo.com/view/55
官方說(shuō)明
Cardinality Aggregation:戳這里
precision_threshold優(yōu)化準(zhǔn)確率和內(nèi)存開(kāi)銷(xiāo)
原始數(shù)據(jù):
統(tǒng)計(jì)下有多少個(gè)不同的品牌
DSL:
GET /tvs/sales/_search {"size" : 0,"aggs" : {"distinct_brand" : {"cardinality" : {"field" : "brand","precision_threshold" : 100 }}} } 注意下 "precision_threshold" : 100 的意思是: brand去重,如果brand的unique value,在100個(gè)以?xún)?nèi),小米,長(zhǎng)虹,三星,TCL,HTL。。。 在多少個(gè)unique value以?xún)?nèi),cardinality,幾乎保證100%準(zhǔn)確 。
cardinality算法,會(huì)占用precision_threshold * 8 byte 內(nèi)存消耗,100 * 8 = 800個(gè)字節(jié) 占用內(nèi)存很小。。。而且unique value如果的確在值以?xún)?nèi),那么可以確保100%準(zhǔn)確
precision_threshold,值設(shè)置的越大,占用內(nèi)存越大, 假設(shè)設(shè)置 1000,那么1000 * 8 = 8000 / 1000 = 8KB,可以確保更多unique value的場(chǎng)景下,100%的準(zhǔn)確
field,去重,count,這時(shí)候,unique value,10000, precision_threshold=10000,10000 * 8 = 80000個(gè)byte,80KB
HyperLogLog++ (HLL)算法性能優(yōu)化
cardinality底層算法:HLL算法,HLL算法的性能會(huì)對(duì)所有的uqniue value取hash值,通過(guò)hash值近似去求distcint count,存在誤差 .
默認(rèn)情況下,發(fā)送一個(gè)cardinality請(qǐng)求的時(shí)候,會(huì)動(dòng)態(tài)地對(duì)所有的field value,取hash值;
優(yōu)化的話(huà): 將取hash值的操作,前移到建立索引的時(shí)候 ,如下
PUT /tvs/ {"mappings": {"sales": {"properties": {"brand": {"type": "text","fields": {"hash": {"type": "murmur3" }}}}}} }這樣在執(zhí)行同樣的查詢(xún)的話(huà),就不會(huì)在請(qǐng)求的時(shí)候執(zhí)行hash值了。
GET /tvs/sales/_search {"size" : 0,"aggs" : {"distinct_brand" : {"cardinality" : {"field" : "brand.hash","precision_threshold" : 100 }}} }總結(jié)
以上是生活随笔為你收集整理的白话Elasticsearch47-深入聚合数据分析之Cardinality Aggs-cardinality算法之优化内存开销以及HLL算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 白话Elasticsearch46-深入
- 下一篇: 白话Elasticsearch48-深入