一次Hadoop開發思路分享

2021-09-21 05:21:43 字數 1777 閱讀 5387

困擾了自己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 實時更新和打包功能。隨後開始重點頁面的 的編寫,在編寫的...