Hadoop實現join的幾種方法

2021-10-11 22:46:26 字數 1352 閱讀 4713

reduce side join是一種最簡單的join方式,其主要思想如下: 

在map階段,map函式同時讀取兩個檔案file1和file2,為了區分兩種**的key/value資料對,對每條資料打乙個標籤》 (tag),比如:tag=0表示來自檔案file1,tag=2表示來自檔案file2。即:map階段的主要任務是對不同檔案中的資料打標籤。> 在reduce階段,reduce函式獲取key相同的來自file1和file2檔案的value list, 

然後對於同乙個key,對file1和file2中的資料進行join(笛卡爾乘積)。即:reduce階段進行實際的連線操作。

之所以存在reduce side join,是因為在map階段不能獲取所有需要的join欄位,即:同乙個key對應的字段可能位於不同map中。reduce side join是非常低效的,因為shuffle階段要進行大量的資料傳輸。 map side join是針對以下場景進行的優化:兩個待連線表中,有乙個表非常大,而另乙個表非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多 份,讓每個map task記憶體中存在乙份(比如存放到hash table中),然後只掃瞄大表:對於大表中的每一條記錄key/value,在hash table中查詢是否有相同的key的記錄,如果有,則連線後輸出即可。

semijoin,也叫半連線,是從分布式資料庫中借鑑過來的方法。它的產生動機是:對於reduce side join,跨機器的資料傳輸量非常大,這成了join操作的乙個瓶頸,如果能夠在map端過濾掉不會參加join操作的資料,則可以大大節省網路io。 

實現方法很簡單:選取乙個小表,假設是file1,將其參與join的key抽取出來,儲存到檔案file3中,file3檔案一般很小,可以放到 

記憶體中。在map階段,使用distributedcache將file3複製到各個tasktracker上,然後將file2中不在file3中的 key對應的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同。

整個計算過程是:

(1)在map階段,把所有記錄標記成的形式,其中key是id,value則根據**不同取不同的形式:**於表a的記錄,value的值為"a#"+name;**於表b的記錄,value的值為"b#"+score。

(2)在reduce階段,先把每個key下的value列表拆分為分別來自表a和表b的兩部分,分別放入兩個向量中。然後遍歷兩個向量做笛卡爾積,形成一條條最終結果。

如下圖所示:

參考:

Hadoop實現join的有幾種方法?

問題分析 本題主要是考察學員對mapreduce的熟悉程度 核心答案講解 1 reduce side join reduce side join是一種最簡單的join方式,其主要思想如下 在map階段,map函式同時讀取兩個檔案file1和file2,為了區分兩種 的key value資料對,對每條...

hadoop 聯合 join操作

hadoop join操作類似於sql中的功能,就是對多表進行取子集並合併一起。其中有很多任務具已經可用,如pig,hive,cascading.map端聯接 reduce端聯接 同樣,就 是聯接處理時在reduce端。那麼有哪些步驟呢?討厭原書的翻譯者把它譯作幾種方法!1.由於在reduce端處理...

Hadoop 中的兩表join

作為資料分析中經常進行的join 操作,傳統dbms 資料庫已經將各種演算法優化到了極致,而對於hadoop 使用的mapreduce 所進行的join 操作,去年開始也是有各種不同的算 文出現,討論各種演算法的適用場景和取捨條件,本文討論hive 中出現的幾種join 優化,然後討論其他演算法實現...