Hadoop中兩表JOIN的處理方法

2021-07-16 13:53:27 字數 1226 閱讀 7034

hadoop中兩表join的處理方法

在reduce階段join。

map階段標記資料來自哪個檔案,比如來自file1標記tag=1,來自file2標記tag=2。

reduce階段把key相同的file1的資料和file2的資料通過笛卡爾乘積join在一起。

個人理解:舉個例子

file1 有

file2 有

可以join成

在map階段join。

適用於情況:兩個待連線表中,有乙個表非常大,而另乙個表非常小。以至於小的表可以放進去記憶體中。

那麼就把小表在每個map task中複製乙份,然後只掃瞄大表,對大表中的每一條記錄,看看key是否存在於小表中,將匹配的key的資料join起來輸出。

這個是要改進reduce side join。建立乙個小表file3,把file1的所有要參加join的資料的key複製進去,然後把file3複製到每乙個map task中去,然後找出不在file2中的key,過濾掉這些資料後再進行reduce side join,減少跨機器資料傳輸。

個人理解:舉個例子

file1 有

file2 有

建立乙個小表file3,所有要參加join的資料的key複製進去也就是

[1, 2, 3],然後發現file2中沒有key=3的,所以可以過濾掉key=3的資料後再進行reduce join,來減少跨機器資料傳輸。

繼續改進3。引入bloom filter。這種資料結構的特點是,存在false positive。如果使用它判斷乙個元素在集合中(positive),那其實有可能不在(false)。但是如果使用它判斷乙個元素不在集合中,那這個元素就真的不在這個集合中了。(沒有false negative)

利用這個特點可以怎麼改進3呢?在3中的file3我們可以用bloom filter來實現,要判斷file2的key是否存在於file3中的時候直接使用bloom filter來判斷。這樣,如果判斷說file2的某個key存在於file3中(positive),但是實際不在(false),那也無所謂,只是少過濾了一些key而已,還是可以正確地join。但是bloom filter可以保證沒有false negative,如果判斷file2的某個key不在file3中,那就真的不在file3中,這樣可以保證join的正確性(不會少join了一些資料)。

參考

Hadoop 中的兩表join

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

Hadoop 中的兩表join

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

hadoop中join的基本應用

map端的主要工作 為來自不同表或檔案的key value對打標籤以區別不停 的記錄。然後用連線字段作為key,其餘部分和新加部分的標誌作為value,最後進行輸出。reduce段主要工作 在reduce端以連線字段作為key的分組已經完成,我們只需要在每乙個分組當中將那些 於不同檔案的記錄 在ma...