困擾了自己1周的乙個問題終於得到解決了,感謝給我幫助的同學,同時記錄下來分享給大家.
問題簡化描述:
思路分析:
問題有幾個關鍵點,第一,不重複,第二,數量上要滿足,第三,偏好分數score。
如何保證,主題之間的使用者不重複呢?
其實就是完成,乙個使用者只能屬於乙個主題的過程,當然,我們可以很簡單的對乙個使用者下的所有偏好分數進行排序,取出最偏好的主題。
雖然這樣避免了重複的問題,可是問題來了,如果偏好主題t1要求的數量是100w,而僅僅只有90w的使用者id對t1最偏好,這該如何補數呢?又如何通過程式來自動化的實現這個過程呢?越想越複雜!
這個問題好像有點類似於高考填自願的問題,我們每乙個人會填寫幾個志願,但是我們終究只會被乙個院校錄取,這是怎麼做到的呢?是否可以從中借鑑呢?
首先,我們根據hdfs的內容,寫乙個mapreduce完成一次計算,形成下面的使用者志願hdfs內容:
使用者id 主題id-a:score1;主題id-b:score2;...
很簡單,希望得到乙個使用者id下面按照score desc排序的主題列表,上面一行其實就是說:
使用者id的第一志願是主題a,第二志願是主題b...。
------------------------------------------
接下來,形成下面的乙個列表list資訊:
主題a count-a
主題b count-b
主題c count-c
...
按照主題需要的使用者id的數量進行asc排序。
------------------------------------------
下面,我們就來看如何進行主題選擇使用者的過程:
我們首先選擇對數量要求最少的主題a完成下面的mapreduce計算:
這樣,我們就完成了主題a的使用者篩選問題。
接下來,我們取出list中數量要求比a多一點的主題b,那麼它怎麼取使用者呢?
很簡單,我們只需要在map處理階段,傳遞主題a生成的結果hdfs路徑(路徑下面的檔案內容當然是主題a的使用者)用於reduce階段取使用者時進行過濾。
那麼,主題c又如何取使用者呢?
類似的,只需要給map多傳遞主題a,主題b已經占用的使用者資訊用於過濾,其他處理操作不變!
其實,我們可以發現,上面的mapreduce其實可以是乙個通用的程式,類似於command:
hadoop jar ***.jar 主題id 數量 [input1,input2,input3,...] 使用者志願hdfs路徑 輸出路徑
其中input1,input2,input3,...是可選的,其實就是用於使用者過濾的。
最後,我們可以寫乙個shell指令碼,根據list的內容來進行重複呼叫上面的command,通過傳遞不同的參
數資訊達到目的,這樣我們就可以自動化實現上面的要求了!
第一次部落格分享
作為乙個新手,第一次寫部落格其實是不知道要說什麼,更不知道從哪說起,寫之前看了一些別人寫的部落格,大多數的文章中已經多方面涉及到技術 經歷等等,很顯然我各個方面都是顯然不足的,還需要自身的努力和時間的積累,說實話以前的我根本都沒有想過自己會走上學習程式設計的道路,對這些東西的了解僅僅在於外表或者說是...
記一次微信分享
只要是h5,都離不開分享,具體過程是怎樣的呢?接下來看看流程 下面是具體業務邏輯的實現 import from utils mutils import from api wxshare export default created 隨時隨地參與噢 methods script utils mutil...
記一次H5開發App經驗分享
在大學為了能夠有一定的開發經驗,選擇學校的科研訓練作為自己的第一次專案實踐。專案設計開發 首先編譯器選擇的hbuilderx輕便型編譯器,主要是借用它提供和安卓模擬器 我所使用的是夜神模擬器 埠號為62001 和海馬玩模擬器 埠號為26944 實時更新和打包功能。隨後開始重點頁面的 的編寫,在編寫的...