本發(fā)明涉及高速數(shù)據(jù)流計(jì)算領(lǐng)域,具體涉及一種高速數(shù)據(jù)流中top-n基數(shù)數(shù)據(jù)的估算方法。
背景技術(shù):
隨著現(xiàn)代互聯(lián)網(wǎng)技術(shù)與傳感器技術(shù)的發(fā)展,數(shù)據(jù)規(guī)模與日俱增,生產(chǎn)中有很多場(chǎng)景下的數(shù)據(jù)呈現(xiàn)出快速產(chǎn)生和內(nèi)容復(fù)雜的特征,遠(yuǎn)超硬件處理性能的增長(zhǎng),導(dǎo)致只能以一種流式的方式處理這些數(shù)據(jù)。小規(guī)模數(shù)據(jù)環(huán)境下使用哈希表精確求解基數(shù)與top-n的方法已經(jīng)不能適應(yīng)這種高速大規(guī)模數(shù)據(jù)流,因此數(shù)據(jù)流算法應(yīng)運(yùn)而生。通過(guò)只使用極小的存儲(chǔ)空間,就對(duì)基數(shù)作出高精度估算的HyperLogLog Counting算法就是這其中一個(gè)已經(jīng)廣泛應(yīng)用的算法。
現(xiàn)有技術(shù)中常采用的方法是為每一種數(shù)據(jù)類(lèi)型分配一個(gè)HLL counter,該數(shù)據(jù)類(lèi)型和HLL coutner的對(duì)應(yīng)關(guān)系用一個(gè)哈希表存儲(chǔ),當(dāng)新數(shù)據(jù)D出現(xiàn)時(shí),處理過(guò)程為:1、按業(yè)務(wù)進(jìn)行分類(lèi),設(shè)為類(lèi)型X;2、在X對(duì)應(yīng)的HLL counter中計(jì)入D,得到更新后的基數(shù),設(shè)為Y;3、將X、Y與現(xiàn)有top-n數(shù)據(jù)比較:1)該X已經(jīng)在top-n中,更新X在top-n中的基數(shù)值;2)如果top-n數(shù)據(jù)還不足n個(gè),存入X及Y;3)如果X比top-n中基數(shù)最小的分類(lèi)x的基數(shù)y更大,用X和Y替換x和y,如圖1所示。
在求top-n時(shí),關(guān)心的只有排序前n個(gè)數(shù)據(jù),但在哈希表中卻不得不保存所有數(shù)據(jù),在現(xiàn)今數(shù)據(jù)越趨復(fù)雜的背景下,這將成為一個(gè)巨大的存儲(chǔ)開(kāi)銷(xiāo)。
數(shù)據(jù)流:只能以事先規(guī)定好的順序被讀取一次的數(shù)據(jù)的一個(gè)序列。
基數(shù):指一個(gè)集合中不同元素的個(gè)數(shù)。
top-n:指一個(gè)集合在某種排序下的前n個(gè)元素,例如“求一個(gè)班級(jí)里成績(jī)最好的10個(gè)學(xué)生”就是一個(gè)top-10問(wèn)題。
哈希表:也叫散列表,是根據(jù)關(guān)鍵碼值而直接訪問(wèn)表中一個(gè)位置來(lái)加快查找速度的數(shù)據(jù)結(jié)構(gòu)。
HyperLogLog Counting:一種用極小存儲(chǔ)空間對(duì)數(shù)據(jù)流基數(shù)進(jìn)行實(shí)時(shí)估算的方法。
HLL counter:使用HyperLogLog Counting算法計(jì)算基數(shù)的計(jì)數(shù)器。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種高速數(shù)據(jù)流中top-n基數(shù)數(shù)據(jù)的估算方法,更加簡(jiǎn)單并方便由硬件并行實(shí)現(xiàn),可以用來(lái)計(jì)算數(shù)據(jù)類(lèi)型的基數(shù)卻不保存數(shù)據(jù)類(lèi)型本身,具有良好的安全性。
為解決上述技術(shù)問(wèn)題,本發(fā)明采用的技術(shù)方案是:
一種高速數(shù)據(jù)流中top-n基數(shù)數(shù)據(jù)的估算方法,包括以下步驟:
步驟1:定義“HyperLogLog Sketch矩陣”數(shù)據(jù)結(jié)構(gòu),設(shè)為S,其寬m高n,每個(gè)元素為一個(gè)HLL counter,對(duì)應(yīng)的,有n個(gè)相互獨(dú)立且哈希值為1~m的哈希函數(shù),設(shè)為f1,f2,…,fn;
步驟2:當(dāng)新數(shù)據(jù)D出現(xiàn)時(shí),按業(yè)務(wù)進(jìn)行分類(lèi),設(shè)為類(lèi)型X;
步驟3:計(jì)算出xi=fi(X),其中i=1,2,…,n;
步驟4:在S(1,x1),S(2,x2),…,S(n,xn)中的HLL counter中計(jì)入D,得到更新后的基數(shù),分別為Y1,Y2,…,Yn,再得到估算基數(shù)Y;
步驟5:將數(shù)據(jù)類(lèi)型X與估算基數(shù)Y更新進(jìn)top-n。
進(jìn)一步的,估算基數(shù)Y為Y1,Y2,…,Yn的最小值或者Y1,Y2,…,Yn的平均值。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
1、方法簡(jiǎn)單并方便由硬件并行實(shí)現(xiàn)。
2、插入和查詢(xún)時(shí)間都是常數(shù),有穩(wěn)定的時(shí)間效率。
3、由于對(duì)占據(jù)著大部分空間的非top-n數(shù)據(jù),不用存儲(chǔ)其數(shù)據(jù)類(lèi)型,且在同一個(gè)HLL counter中,可能不只是記錄一個(gè)數(shù)據(jù)類(lèi)型的基數(shù)而是記錄多個(gè)數(shù)據(jù)類(lèi)型的并集的基數(shù),所以空間效率得到顯著優(yōu)化。
4、本發(fā)明方法可以用來(lái)計(jì)算數(shù)據(jù)類(lèi)型的基數(shù)卻不保存數(shù)據(jù)類(lèi)型本身,具有良好的安全性。
附圖說(shuō)明
圖1是用哈希表和HyperLogLog Counting估算數(shù)據(jù)流中基數(shù)最大的數(shù)據(jù)類(lèi)型。
圖2是本發(fā)明用HyperLogLog Sketch估算數(shù)據(jù)流中基數(shù)最大的數(shù)據(jù)類(lèi)型。
具體實(shí)施方式
下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。在數(shù)據(jù)流中,既不關(guān)心非top-n數(shù)據(jù)的數(shù)據(jù)類(lèi)型是什么,又不需要關(guān)心其實(shí)際基數(shù)是多少,而非top-n數(shù)據(jù)類(lèi)型的基數(shù)相對(duì)于top-n數(shù)據(jù)類(lèi)型的基數(shù)又小得多,即使誤加在一起,對(duì)于top-n數(shù)據(jù)類(lèi)型的基數(shù)精度也損傷不大。
本發(fā)明中,使用的一個(gè)數(shù)據(jù)結(jié)構(gòu)稱(chēng)為“HyperLogLog Sketch矩陣”,設(shè)為S,其寬m高n,每個(gè)元素為一個(gè)HLL counter。對(duì)應(yīng)的,有n個(gè)相互獨(dú)立并且哈希值為1~m的哈希函數(shù),設(shè)為f1,f2,…,fn。如圖2所示,當(dāng)新數(shù)據(jù)D出現(xiàn)時(shí),按以下步驟處理:
1、按業(yè)務(wù)進(jìn)行分類(lèi),設(shè)為類(lèi)型X;
2、計(jì)算出xi=fi(X),其中i=1,2,…,n;
3、在S(1,x1),S(2,x2),…,S(n,xn)中的HLL counter中計(jì)入D,得到更新后的基數(shù),分別為Y1,Y2,…,Yn,為了減少哈希結(jié)果相同的數(shù)據(jù)類(lèi)型之間的相互影響,其最小值為Y;
4、將數(shù)據(jù)類(lèi)型X與估算基數(shù)Y更新進(jìn)top-n,更新方法與現(xiàn)有技術(shù)方案一相同。
本發(fā)明中,計(jì)算一個(gè)集合的基數(shù)可采用多種算法,包括Bitmap、Linear Counting、LogLog Counting或者Adaptive Counting等。多次哈希后,本發(fā)明方法采用了取最小值的方案來(lái)得到最終估算值,在使用了非HyperLogLog Counting算法后,還可以調(diào)整為取平均值。