「 單錶關聯」這個例項要求從給出的資料中尋找所關心的資料,它是對原始資料所包含資訊的挖掘。下面進入這個例項。
1 .例項描述
例項中給出 child-parent(孩子——父母)表,要求輸出 grandchild-grandparent(孫子——爺奶)表。
樣例輸入如下所示。
家族樹狀關係譜:
樣例輸出如下所示。
2 .設計思路
分析這個例項,顯然需要進行單錶連線,連線的是左表的 parent 列和右表的 child 列,且左表和右表是同乙個表。
連線結果中除去連線的兩列就是所需要的結果——「 grandchild–grandparent」表。要用mapreduce 解決這個例項, 首先應該考慮如何實現表的自連線; 其次就是連線列的設定;最後是結果的整理。
考慮到 mapreduce 的 shuffle 過程會將相同的 key 會連線在一起,所以可以將 map 結果的 key 設定成待連線的列,然後列中相同的值就自然會連線在一起了。再與最開始的分析聯絡起來:
要連線的是左表的 parent 列和右表的 child 列,且左表和右表是同乙個表,所以在 map階段將讀入資料分割成 child 和 parent 之後,會將 parent 設定成 key, child 設定成 value進行輸出,並作為左表;再將同一對 child 和 parent 中的 child 設定成 key, parent 設定成value 進行輸出,作為右表。
為了區分輸出中的左右表,需要在輸出的 value 中再加上左右表的資訊,比如在 value 的 string 最開始處加上字元 1 表示左表,加上字元 2 表示右表。
這樣在 map 的結果中就形成了左表和右表,然後在 shuffle 過程中完成連線。 reduce 接收到連線的結果,其中每個 key 的 value-list 就包含了「 grandchild–grandparent」關係。
取出每個key 的 value-list 進行解析,將左表中的 child 放入乙個陣列, 右表中的 parent 放入乙個陣列,然後對兩個陣列求笛卡爾積就是最後的結果了。
3 .程式**
程式**如下所示。
4 .**結果
準備測試資料
通過 eclipse 下面的「 dfs locations」在「 /user/hadoop」目錄下建立輸入檔案「 stjoin_in」資料夾( 備註:「 stjoin_out」不需要建立。)如圖 4.4-1 所示,已經成功建立。
然後在本地建立乙個 txt 檔案,通過 eclipse 上傳到「 /user/hadoop/stjoin_in」資料夾中,乙個 txt 檔案的內容如「例項描述」那個檔案一樣。如圖 4.4-2 所示,成功上傳之後。
從 securecrt 遠處檢視「 master.hadoop」的也能證實我們上傳的檔案,顯示其內容如圖 4.4-3 所示:
執行詳解
( 1) map 處理:
map 函式輸出結果如下所示。
( 2) shuffle 處理
在 shuffle 過程中完成連線。
首先由語句「 0 != grandchildnum && 0 != grandparentnum」得知,只要在「 value-list」中沒有左表或者右表,則不會做處理,可以根據這條規則去除無效的 shuffle 連線。
然後根據下面語句進一步對有效的 shuffle 連線做處理。
針對一條資料進行分析:
分析結果: 左表用「 字元 1」表示, 右錶用「 字元 2」表示,上面的
中的「 key」表示左表與右表的連線鍵。而「 value-list」表示以「 key」連線的左表與右表的
相關資料。
根據上面針對左表與右表不同的處理規則,取得兩個陣列的資料如下所示:
然後根據下面語句進行處理。
處理結果如下面所示:
其他的有效 shuffle 連線處理都是如此。
(3)檢視執行結果
這時我們右擊 eclipse 的「 dfs locations」中「 /user/hadoop」資料夾進行重新整理,這時會發現多出乙個「 stjoin_out」資料夾,且裡面有 3 個檔案,然後開啟雙其「 part-r-00000」檔案,會在 eclipse 中間把內容顯示出來。如圖 4.4-4 所示。
MapReduce案例 好友推薦
用過各種社交平台 如qq 微博 朋友網等等 的小夥伴應該都知道有乙個叫 可能認識 或者 好友推薦 的功能 如下圖 它的演算法主要是根據你們之間的共同好友數進行推薦,當然也有其他如愛好 特長等等。共同好友的數量越多,表明你們可能認識,系統便會自動推薦。今天我將向大家介紹如何使用mapreduce計算共...
使用者登入案例 初級
使用者登入案例需求 1.編寫login.html登入頁面 username password 兩個輸入框 2.使用druid資料庫連線池技術,操作mysql,day14資料庫中user表 3.使用jdbctemplate技術封裝jdbc 5.登入失敗跳轉到failservlet展示 登入失敗,使用者...
mapreduce二次排序案例
為什麼需要二次排序?在mapreduce操作時,我們知道傳遞的會按照key的大小進行排序,最後輸出的結果是按照key排過序的。有的時候我們在key排序的基礎上,對value也進行排序。這種需求就是二次排序 解決思路 我們可以把key和value聯合起來作為新的key,記作newkey。這時,newk...