怎么用bitmap實(shí)現(xiàn)用戶畫像的標(biāo)簽圈人功能-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“怎么用bitmap實(shí)現(xiàn)用戶畫像的標(biāo)簽圈人功能”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

站在用戶的角度思考問題,與客戶深入溝通,找到漾濞網(wǎng)站設(shè)計與漾濞網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋漾濞地區(qū)。

標(biāo)簽有哪些類型呢?

枚舉類標(biāo)簽: 描述性別,地理位置。這類標(biāo)簽取值通常是可枚舉出來的。
時間類標(biāo)簽: 描述業(yè)務(wù)觸達(dá)和流失時間信息。 注: 時間類標(biāo)簽可存儲成數(shù)值。
數(shù)值類標(biāo)簽: 比如賬戶金額,積分?jǐn)?shù)量等。

所以本質(zhì)上,標(biāo)簽只有兩種: 離散枚舉和連續(xù)數(shù)值。

有了標(biāo)簽后,如何在計算機(jī)中建模存儲呢?

最簡單最直觀的方式就是設(shè)置大寬表,即每個標(biāo)簽一個字段。 通常一個小型的畫像系統(tǒng),有幾百個標(biāo)簽足夠。所以對于大部分場景寬表足夠簡單可依賴。

寬表一般存儲在Hive中,出于性能考慮,會存儲到Impala中。當(dāng)數(shù)據(jù)量較大時,Impala也一般無法滿足查詢的性能需求。這是因?yàn)镮mpala沒有索引,每次查詢都是掃表。所以,為了能夠利用索引提升性能,大寬表一般會從Impala轉(zhuǎn)存到Elasticsearch中。

當(dāng)一個用戶Id附著成百上千個標(biāo)簽,按ES存儲方式,會相當(dāng)耗費(fèi)存儲資源,導(dǎo)入數(shù)據(jù)到ES也會成為性能瓶頸。 所以變通的方案是將所有的標(biāo)簽存儲到ES的一個array字段中。但本質(zhì)上,還是大寬表的方案。

大寬表的方案大的問題: 新增標(biāo)簽時間成本太大,所以畫像系統(tǒng)基本是T+1的實(shí)效性。 如果對響應(yīng)時間沒有苛刻的要求,基于Hadoop生態(tài)的ad hoc查詢引擎構(gòu)建寬表,比如Impala或presto是可以使用多張寬表來解決新曾標(biāo)簽T+0生效問題,畢竟大數(shù)據(jù)系統(tǒng),存儲資源還是很充足的。

可惜的是業(yè)務(wù)對系統(tǒng)的需求是: 更高,更快,更強(qiáng),像體育運(yùn)動一樣。

我們用ES存儲標(biāo)簽,查詢速度快的原因是ES構(gòu)建了倒排索引。我們構(gòu)建標(biāo)簽時,標(biāo)簽數(shù)據(jù)的主體是用戶ID, 而在ES的世界,站在倒排索引的角度,標(biāo)簽數(shù)據(jù)的主體是標(biāo)簽,這完全是兩個對立面。

我們使用標(biāo)簽圈人,本質(zhì)上是集合的交并補(bǔ)運(yùn)算。  所以,我們可以干脆再往前邁一步: 直接構(gòu)建標(biāo)簽-用戶ID的映射關(guān)系,而非原始的用戶ID-標(biāo)簽。

這樣,整個數(shù)據(jù)結(jié)構(gòu)就變成類似如下的樣式:

男: 張三,李四,王五...

由于一個標(biāo)簽可以圈定上億的用戶,如何存儲這樣的結(jié)構(gòu)?  RoaringBitmap 。這樣存儲后,標(biāo)簽圈人就脫離了SQL和ES語法,還原到最本質(zhì)的集合運(yùn)算:A and B or (C and D)。

使用標(biāo)簽-用戶ID這種數(shù)據(jù)建模方式,有個很大的問題: 數(shù)值類標(biāo)簽的處理。比如用戶積分。 通常有一種解決方法就是分段,然而這樣做損失了數(shù)據(jù)精度。變得不靈活了。還有一種解決方法是為每個值建立一個bitmap。 這樣做一則耗費(fèi)空間,二則無法很好處理區(qū)間查詢的問題。

使用標(biāo)簽-用戶ID這種方式, bitmap存儲數(shù)據(jù)關(guān)系是標(biāo)簽值等于XXX的用戶ID, 提取核心點(diǎn)bitmap存儲的是等于關(guān)系。 那么bitmap存儲大于或者小于關(guān)系也是可以的。

對于數(shù)值型標(biāo)簽,我們重新定義存儲關(guān)系: bitmap(2) 表示value值大于2的所有用戶ID。 同理, bitmap(5) 表示value值大于5的所有用戶ID。這樣的話,計算value=(3,1000)之間的用戶,使用bitmap(3) andNot bitmap(999)就可以了。很好地解決了區(qū)間查詢的問題。 依然遺留了一個問題: 需要為每個值準(zhǔn)備一個bitmap。

這個問題的解決思路很巧妙: 多個bitmap組合表示一個數(shù)值。例如200, 拆分成個位,十位,百位3個部分,每一部分用10個bitmap存儲。這樣就能夠把bitmap的數(shù)量控制在有限的數(shù)量里面。比如對于int整型,最多需要100個bitmap。

優(yōu)化是沒有止盡的,我們還能走得更遠(yuǎn)。如果數(shù)值采用二進(jìn)制表示,那么每一位只需要2個bitmap, 一個Int類型最多需要64個bitmap。 采用二進(jìn)制,存儲的規(guī)則可以如下設(shè)置:

bitmap(0)表示該位為0的用戶ID集合。
bitmap(1)表示該位為0或1的用戶ID集合。

由于對于二進(jìn)制的某一位,取值只有0和1兩種可能,所以對于二進(jìn)制,每一位只需要bitmap(0), 所以最多需要32+1=33個bitmap存儲。

綜上, 我們解決bitmap數(shù)量的問題,也解決了區(qū)間查詢的問題。但是多位二進(jìn)制組合處理區(qū)間查詢,又引出了新的問題: 多個bitmap如何組合表示一個區(qū)間?

我們把問題再簡化一下,多個bitmap如何表示一個小于等于的區(qū)間。 比如i<7 如何用bitmap表示? 再回顧bitmap的存儲規(guī)則:

bitmap(0)表示該位為0的用戶ID集合。
bitmap(1)表示該位為0或1的用戶ID集合。

我們按從右到左的順序給bitmap位取名字,下標(biāo)從1開始。 例如01,有兩位,分別是b2,b1。

這樣的話: i<7 = i<0111, 用bitmap表示就是b4。 再舉幾個例子:

i<5 = i < 0101, 用bitmap表示就是 (b4 and b2) or (b4 and b3)

為了理解這個過程,我自己畫了如下的橫向樹形圖:

      1
   1
      0
0
      1
   0  
      0

來觀察這個規(guī)律,最后實(shí)現(xiàn)的代碼如下:

import lombok.Data;
import org.roaringbitmap.RoaringBitmap;

import java.util.*;

public class RangeBitmapDemo2 {

    @Data
    private static class QueryCond{

        private List<String> base = new ArrayList<>();

        private List<List<String>> lowerRange = new ArrayList();

        public void addBase(String val){
            this.base.add(val);
        }

        public void addLowerRange(String val){
            List<String> list = new ArrayList();
            list.addAll(base);
            list.add(val);
            this.lowerRange.add(list);
        }
    }

    public static void query(int upper, int binaryLength){
        String val =String.format("%"+binaryLength+"s", Integer.toBinaryString(upper)).replaceAll(" ","0"); //這里可以補(bǔ)空格
        System.out.println("query: upper is "+val);

        QueryCond cond = new QueryCond();

        char cur = val.charAt(0);

        if(cur=='0'){
            cond.addBase("b"+binaryLength);
        }

        for(int i=1;i<val.length();i++){
            cur = val.charAt(i);
            if(cur == '0'){

                int back = i-1;
                while(back>=0 && val.charAt(back)=='1'){
                    cond.addLowerRange("b"+(binaryLength-back));
                    back -=1;
                }
                cond.addBase("b"+(binaryLength-i));
            }
        }

        System.out.println("query cond: "+cond);

    }

    public static void main(String[] args) {

        for(int i=0;i<32;i++){
            query(i, 6);
        }
    }
}

打印的結(jié)果

query: upper is 000110
RangeBitmapDemo2.QueryCond(base=[b6, b5, b4, b1], lowerRange=[[b6, b5, b4, b2], [b6, b5, b4, b3]])

表示000110的組合關(guān)系為(b6 & b5 & b4 & b3 & b2 & b1)  or (b6 & b5 & b4 & b2) or (b6 & b5 & b4 & b3) 即整個結(jié)果由3個部分組合而成。

“怎么用bitmap實(shí)現(xiàn)用戶畫像的標(biāo)簽圈人功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站欄目:怎么用bitmap實(shí)現(xiàn)用戶畫像的標(biāo)簽圈人功能-創(chuàng)新互聯(lián)
文章出自:http://bm7419.com/article22/gjdjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、域名注冊品牌網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)網(wǎng)站收錄、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司