2012-07-18 59 views
0

假設我有三種基本模型:用戶,公司和訪問。每次用戶訪問公司時,都會以此格式記錄訪問(user_id, company_id, visit_date)使用MapReduce或其他分佈式計算方法進行分析計算?

我希望能夠計算公司訪問之間的平均時間。沒有整體訪問,但具體來說,他們的客戶平均多久才返回商店等待。

例如,如果一個用戶在星期二,星期三和星期五訪問了一天的一個「缺口」,兩天的一個「缺口」=>(1,2)。如果另一個用戶在星期一和星期五訪問,則會給​​出4天的差距=>(4)。如果第三個用戶只訪問過一次,他不應該考慮。用戶訪問該公司的平均時間爲(1 + 2 + 4)/ 3 = 2.333天。

如果我有成千上萬的用戶,水龍頭和公司,我想爲每家公司計算一個數字,我應該如何處理這個問題?我之前只做過基本的MapReduce應用程序,但我無法弄清楚我的Map和Reduce步驟是如何完成的。任何人都可以幫助我找出僞代碼中的MapReduce?或者還有其他一些我可以合理執行的分佈式計算方法嗎?爲了記錄,我想每晚在我的數據庫上執行此操作。

回答

0

過分簡單化的方法是有兩個工作步驟。

第一個作業步驟有一個映射器,以「company:user」和「visit_date」的形式編寫關鍵值。在上面的例子中,映射器會寫類似:

"user1:companyA" -> "2012/07/16" 
"user1:comapnyA" -> "2012/07/17" 
"user1:comapnyA" -> "2012/07/19" 
"user2:comapnyA" -> "2012/07/15" 
"user2:comapnyA" -> "2012/07/19" 
... 

這意味着每次調用減速將由單個用戶通過您的訪問,以一個單一的公司。這意味着,一個調用減速將經過:

"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19} 

和另一個電話將通過在:

"user2:companyA" -> {2012/07/15, 2012/07/19} 

我假設設定日期(傳遞以Iterable值)是根據您的分類輕鬆進行管理,找出差距,並以「公司」和「差距」形式爲每個差距記錄一個關鍵值對。例如,通過在:

"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19} 

第一份工作的減速將會寫入方面:

"companyA" -> 1 
"compnayA" -> 2 

第二職業都有,只是通公司/ GAP信息到直通映射器減速器。每次調用reducer都會爲特定公司提供可計算的間隙值。迭代數據以產生平均值,並以「公司」和「平均值」格式編寫關鍵值對。

如果原來的一組訪問量太大,我們可以討論讓hadoop使用一些自定義比較器爲您排序。

+0

我對你正在做的「差距」有點困惑,你能詳細說明一下嗎? – 2012-07-19 13:57:19

+0

差距就像您定義的那樣:用戶對公司進行的兩次連續訪問之間的時間差異。我會再編輯一些答案 – 2012-07-19 15:13:38