49_深入聚合數(shù)據(jù)分析_cardinality算法之優(yōu)化內(nèi)存開銷以及HLL算法
cardinality吕座,count(distinct)奴璃,5%的錯(cuò)誤率己英,性能在100ms左右
1姨夹、precision_threshold優(yōu)化準(zhǔn)確率和內(nèi)存開銷
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"distinct_brand" : {
"cardinality" : {
"field" : "brand",
"precision_threshold" : 100
}
}
}
}
brand去重甜癞,如果brand的unique value夕晓,在100個(gè)以內(nèi),小米悠咱,長虹蒸辆,三星,TCL析既,HTL躬贡。。眼坏。
在多少個(gè)unique value以內(nèi)拂玻,cardinality,幾乎保證100%準(zhǔn)確
cardinality算法宰译,會(huì)占用precision_threshold * 8 byte 內(nèi)存消耗檐蚜,100 * 8 = 800個(gè)字節(jié)
占用內(nèi)存很小。囤屹。熬甚。而且unique value如果的確在值以內(nèi),那么可以確保100%準(zhǔn)確
100肋坚,數(shù)百萬的unique value乡括,錯(cuò)誤率在5%以內(nèi)
precision_threshold肃廓,值設(shè)置的越大,占用內(nèi)存越大诲泌,1000 * 8 = 8000 / 1000 = 8KB盲赊,可以確保更多unique value的場景下,100%的準(zhǔn)確
field敷扫,去重哀蘑,count,這時(shí)候葵第,unique value绘迁,10000,precision_threshold=10000卒密,10000 * 8 = 80000個(gè)byte缀台,80KB
2、HyperLogLog++ (HLL)算法性能優(yōu)化
cardinality底層算法:HLL算法哮奇,HLL算法的性能
會(huì)對所有的uqniue value取hash值膛腐,通過hash值近似去求distcint count,誤差
默認(rèn)情況下鼎俘,發(fā)送一個(gè)cardinality請求的時(shí)候哲身,會(huì)動(dòng)態(tài)地對所有的field value,取hash值; 將取hash值的操作贸伐,前移到建立索引的時(shí)候
PUT /tvs/
{
"mappings": {
"sales": {
"properties": {
"brand": {
"type": "text",
"fields": {
"hash": {
"type": "murmur3"
}
}
}
}
}
}
}
將取hash值的操作勘天,前移到建立索引的時(shí)候,.再來進(jìn)行cardinality聚合查詢的時(shí)候,brand.hash 節(jié)省時(shí)間.
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"distinct_brand" : {
"cardinality" : {
"field" : "brand.hash",
"precision_threshold" : 100
}
}
}
}