最近在做使用mahout做協(xié)同過濾推薦的時候搀菩,發(fā)現(xiàn)無論是數(shù)據(jù)源還是推薦函數(shù)的接口user_id必須是Long型的變量
由于業(yè)務(wù)提供的user_id
是uuid
汗销,所以是個字符串類型纸厉,并且item_id
(做的是崗位推薦锐帜,即為job_id)也是uuid
類型祭示,于是另外再弄三張表uid-uuid
败徊,jid-jjid
,uid-jid-score
的映射撞羽,但是這樣做實在太麻煩了阐斜,我分析用戶日志存儲用戶偏好表還要再多維護所有用戶和所有崗位表,遂開始研究uuid
和uid
能不能做個映射诀紊。
首先了解一下UUID:
UUID是指在一臺機器上生成的數(shù)字谒出,它保證對在同一時空中的所有機器都是唯一的。通常平臺會提供生成的API邻奠。按照開放軟件基金會(OSF)制定的標準計算笤喳,用到了以太網(wǎng)卡地址、納秒級時間碌宴、芯片ID碼和許多可能的數(shù)字
UUID由以下幾部分的組合:
- 當前日期和時間杀狡,UUID的第一個部分與時間有關(guān),如果你在生成一個UUID之后贰镣,過幾秒又生成一個UUID呜象,則第一個部分不同膳凝,其余相同。
- 時鐘序列恭陡。
- 全局唯一的IEEE機器識別號鸠项,如果有網(wǎng)卡,從網(wǎng)卡MAC地址獲得子姜,沒有網(wǎng)卡以其他方式獲得祟绊。
UUID的唯一缺陷在于生成的結(jié)果串會比較長。關(guān)于UUID這個標準使用最普遍的是微軟的GUID(Globals Unique Identifiers)哥捕。其格式為:xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)牧抽,其中每個 x 是 0-9 或 a-f 范圍內(nèi)的一個十六進制的數(shù)字
重點來了:
標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx (8-4-4-4-12) 其中每個 x 是 0-9 或 a-f 范圍內(nèi)的一個十六進制的數(shù)字。
我現(xiàn)在需要處理的uuid
就是這個標準的UUID格式
遥赚,了解了UUID的構(gòu)成以后我們就好辦了:
1. 首先將uuid去掉連接符扬舒,從原先的uuid格式字符串轉(zhuǎn)化為沒有連接符的16進制字符串
2. 將16進制字符串轉(zhuǎn)化為10進制數(shù)(內(nèi)部使用mahout接口)
- 將10進制數(shù)再轉(zhuǎn)回16進制的字符串(外部接口調(diào)用使用,記得補0)
用BigInt來存儲這個唯一的十進制數(shù)凫佛,這樣就構(gòu)成了一種映射讲坎。
查了下python的內(nèi)置uuid庫的API用法:
這里我直接用python
演示(python3
)
# Author:XzAmrzs
import uuid as uid2uuid
a = '0b27021f-3766-4b7b-b761-3c29768612fe'
# a = '4da5cc89-f65c-4658-8e78-2eb978e44b50'
x = uid2uuid.UUID(a)
print(x) # 0b27021f-3766-4b7b-b761-3c29768612fe
print(x.hex) # 0b27021f37664b7bb7613c29768612fe
uid = int(x.hex, 16) # 16進制字符串轉(zhuǎn)10進制數(shù)
print(uid) # 14824050569154520558414196490098840318
uuid = "{:032x}".format(uid) # 注意這里要用0補齊32位,否則以0開頭的16的轉(zhuǎn)回來會丟0
print(uuid) # 0b27021f37664b7bb7613c29768612fe
print(uid2uuid.UUID(uuid)) # 0b27021f-3766-4b7b-b761-3c29768612fe
輸出見下圖
0b27021f-3766-4b7b-b761-3c29768612fe
0b27021f37664b7bb7613c29768612fe
14824050569154520558414196490098840318
0b27021f37664b7bb7613c29768612fe
0b27021f-3766-4b7b-b761-3c29768612fe
寫完的時候google了一下發(fā)現(xiàn)墻外面也有不少討論這個的愧薛,mahout官方也是說要做轉(zhuǎn)換晨炕,直接用字符串類型進入推薦算法,效率會特別慢毫炉!
如下:
Why user id and item id must be long type ?
how to map uuid to userid in preference class to use mahout recommender
mahout-user mailing list archives:UUID based user IDs
參考:
Python 3.x 格式化輸出字符串 % & format 筆記
python常用的十進制朋贬、16進制辩块、字符串溉痢、字節(jié)串之間的轉(zhuǎn)換