如何使用MapReduce實現兩表的join

2021-10-21 03:30:06 字數 835 閱讀 2043

map join:

map side join 是針對一下場景進行的優化。兩個待連線的表中,有乙個表非常大,而另乙個非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多份,讓每乙個map task記憶體中存在乙份(比如放在hash table中),然後只掃瞄大表:對於大表中的每一條記錄key/value,在hash table中查詢是否具有相同key的記錄,入股有,則連線後輸出即可。

場景:mapjoin 適用於有乙份資料較小的連線情況。

做法:直接將較小的資料載入到記憶體中,按照連線的關鍵字建立索引,大份資料作為maptask的輸入資料對 map()方法的每次輸入都去記憶體當中直接去匹配連線。然後把連線結果按 key 輸出,這種方法要使用 hadoop中的 distributedcache 把小份資料分布到各個計算節點,每個 maptask 執行任務的節點都需要載入該資料到記憶體,並且按連線關鍵字建立索引。

reduce join

在map階段,map函式同時讀取兩個檔案file1和file2,為了區分兩種**key/value資料對,沒條資料打乙個標籤(tag),比如:tag=0表示來自檔案file1,tag=2表示來自檔案file2。

在map階段, 把關鍵字作為key輸出,並在value中標記出資料是來自data1還是data2。因為在shuffle階段已經自然按key分組,reduce階段,判斷每乙個value是來自data1還是data2,在內部分成2組,做集合的乘積。

這種方法有2個問題:

map階段沒有對資料**,shuffle的網路傳輸和排序效能很低。

reduce端對2個集合做乘積計算,很耗記憶體,容易導致oom。

如何使用MapReduce實現兩表的join

map join map side join 是針對一下場景進行的優化。兩個待連線的表中,有乙個表非常大,而另乙個非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多份,讓每乙個map task記憶體中存在乙份 比如放在hash table中 然後只掃瞄大表 對於大表中的每一條記錄k...

如何使用MapReduce實現兩表的join

map join map side join 是針對一下場景進行的優化。兩個待連線的表中,有乙個表非常大,而另乙個非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多份,讓每乙個map task記憶體中存在乙份 比如放在hash table中 然後只掃瞄大表 對於大表中的每一條記錄k...

MapReduce多重MR如何實現

判斷output資料夾是否存在,如果存在則刪除 path path new path otherargs 1 取第1個表示輸出目錄引數 第0個引數是輸入目錄 filesystem filesystem path.getfilesystem conf 根據path找到這個檔案 if filesyste...