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 優化,然後討論其他演算法實現...