在構(gòu)建精準(zhǔn)用戶(hù)畫(huà)像時(shí),面臨著這樣一個(gè)問(wèn)題:日志采集不能成功地收集用戶(hù)的所有ID,且每條業(yè)務(wù)線(xiàn)有各自定義的UID用來(lái)標(biāo)識(shí)用戶(hù),從而造成了用戶(hù)ID的零碎化。因此,為了做用戶(hù)標(biāo)簽的整合,用戶(hù)ID之間的強(qiáng)打通(亦稱(chēng)為ID-Mapping)成了迫切的需求。大概三年前,在知乎上有這樣一個(gè)與之相類(lèi)似的問(wèn)題:如何用MR實(shí)現(xiàn)并查集以對(duì)海量數(shù)據(jù)pair做聚合;目前為止還無(wú)人解答。本文將提供一個(gè)可能的解決方案——如何用MR計(jì)算框架來(lái)實(shí)現(xiàn)大數(shù)據(jù)下的ID強(qiáng)打通。
首先,簡(jiǎn)要地介紹下Android設(shè)備常見(jiàn)的ID:
- IMEI(International Mobile Equipment Identity),即通常所說(shuō)的手機(jī)序列號(hào)、手機(jī)“串號(hào)”,用于在移動(dòng)電話(huà)網(wǎng)絡(luò)中識(shí)別每一部獨(dú)立的手機(jī)等行動(dòng)通訊裝置;序列號(hào)共有15位數(shù)字,前6位(TAC)是型號(hào)核準(zhǔn)號(hào)碼,代表手機(jī)類(lèi)型。接著2位(FAC)是最后裝配號(hào),代表產(chǎn)地。后6位(SNR)是串號(hào),代表生產(chǎn)順序號(hào)。最后1位(SP)一般為0,是檢驗(yàn)碼,備用。
- MAC(Media Access Control)一般代指MAC位址,為網(wǎng)卡的標(biāo)識(shí),用來(lái)定義網(wǎng)絡(luò)設(shè)備的位置。
- IMSI(International Mobile SubscriberIdentification Number),儲(chǔ)存在SIM卡中,可用于區(qū)別移動(dòng)用戶(hù)的有效信息;其總長(zhǎng)度不超過(guò)15位,同樣使用0~9的數(shù)字。其中MCC是移動(dòng)用戶(hù)所屬?lài)?guó)家代號(hào),占3位數(shù)字,中國(guó)的MCC規(guī)定為460;MNC是移動(dòng)網(wǎng)號(hào)碼,最多由兩位數(shù)字組成,用于識(shí)別移動(dòng)用戶(hù)所歸屬的移動(dòng)通信網(wǎng);MSIN是移動(dòng)用戶(hù)識(shí)別碼,用以識(shí)別某一移動(dòng)通信網(wǎng)中的移動(dòng)用戶(hù)。
- Android ID是系統(tǒng)隨機(jī)生成的設(shè)備ID 為一串64位的編碼(十六進(jìn)制的字符串),通過(guò)它可以知道設(shè)備的壽命(在設(shè)備恢復(fù)出廠(chǎng)設(shè)置或刷機(jī)后,該值可能會(huì)改變)。
2. 設(shè)計(jì)
從圖論的角度出發(fā),ID強(qiáng)打通更像是將小連通圖合并成一個(gè)大連通圖;比如,在日志中出現(xiàn)如下三條記錄,分別表示三個(gè)ID集合(小連通圖):
A B C
C D
D E
通過(guò)將三個(gè)小連通圖合并,便可得到一個(gè)大連通圖——完整的ID集合列表A B C D E。淘寶明風(fēng)介紹了如何用Spark GraphX通過(guò)outerJoinVertices等運(yùn)算符來(lái)做大數(shù)據(jù)下的多圖合并;針對(duì)ID強(qiáng)打通的場(chǎng)景,也可采用類(lèi)似的思路:日志數(shù)據(jù)構(gòu)建大的稀疏圖,然后采用自join的方式做打通。但是,我并沒(méi)有選用GraphX,理由如下:
- GraphX只支持有向圖,而不支持無(wú)向圖,而ID之間的關(guān)聯(lián)關(guān)系是一個(gè)無(wú)向連通圖;
- GraphX的join操作不完全可控,“不完全可控”是指在做圖合并時(shí)我們需要做過(guò)濾山寨設(shè)備、一對(duì)多的ID等操作,而在GraphX封裝好的join算子上實(shí)現(xiàn)過(guò)濾操作則成本過(guò)高。