1. 程式人生 > >Hadoop中兩表JOIN的處理方法

Hadoop中兩表JOIN的處理方法

參考

小結

1,reduce side join

在reduce階段join。

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

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

個人理解:舉個例子
file1 有{1:'a', 2:'b', 3:'c'}
file2 有{1:'A', 2:'B'}

可以join成{1:['a','A'], 2:['b', 'B']}

2,map side join

在map階段join。

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

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

3,semijoin半連線

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

個人理解:舉個例子
file1 有{1:'a', 2:'b', 3:'c'}
file2 有{1:'A', 2:'B'}

建立一個小表file3,所有要參加join的資料的key複製進去也就是
[1, 2, 3],然後發現file2中沒有key=3的,所以可以過濾掉key=3的資料後再進行reduce join,來減少跨機器資料傳輸。

4,加入bloom filter

繼續改進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了一些資料)。

5,二次排序

相關推薦

HadoopJOIN處理方法

參考 小結 1,reduce side join 在reduce階段join。 map階段標記資料來自哪個檔案,比如來自file1標記tag=1,來自file2標記tag=2。 reduce階段把key相同的file1的資料和file2的資

hadoop join處理方法

 1. 概述 在傳統資料庫(如:MYSQL)中,JOIN操作是非常常見且非常耗時的。而在HADOOP中進行JOIN操作,同樣常見且耗時,由於Hadoop的獨特設計思想,當進行JOIN操作時,有一些特殊的技巧。 本文首先介紹了Hadoop上通常的JOIN實現方法,然後給出了幾

mysql互換列數據方法

名稱 創建 sel table 進行 ras tab ont chan 1.創建表及記錄用於測試 CREATE TABLE `product` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘產品id‘

MapReduce資料處理join連線

現在這裡有兩個text文件,需要把它合併成一個文件,並且裡面的資料不能有冗餘.. <strong><span style="color:#FF0000;">info.txt檔案:</span></stro

MySQL 關聯更新數據

log style one col bsp expired sta class inner   通過用戶手機號,更新他的添加時間和過期時間,兩表關聯更改副表內容 UPDATE expand_money e INNER JOIN members m ON e.uid =

java執行shell命令有空格的處理方法

java執行shell命令中有空格的處理?Runtime.getRuntime().exec(cmdstring);如果此時cmdstring中的參數(例如cp文件時文件名)含有特殊符號空格,此時就會出現錯誤,因為源碼會按照一些特殊字符(" \t\n\r\f",註意到其中含有空格)去切分cmdstring

CSDN程式碼內容複製後在程式格式報錯處理方法

很多人遇到程式程式碼複製後格式問題報錯後,往往都是直接一行一行的調節格式內容,可能程式碼量不多,一般花費10-40分鐘都可以調節過來,但其實不需要這麼麻煩,可以總結一些簡單的方法: 1、拷貝程式程式碼 2、程式設計軟體中整體報錯

mybatis比較符號的處理方法

第一種方法: 用了轉義字元把>和<替換掉,然後就沒有問題了。 SELECT * FROM test WHERE 1 = 1 AND start_date  &lt;= CURRENT_DATE AND end_date &gt;= CURRENT_DAT

解決mybatis註解開發時在一個方法裡面新增,一個自動生成的主鍵作為另一個的外來鍵新增的問題

1、mapper層裡的方法上添加註解: 實體類屬性:cExperimentaltaskid(id) 表字段:c_experimentaltaskid(主鍵id欄位) @Options(useGeneratedKeys = true, keyProperty = "cExperimentalta

Promise.all對於reject的處理方法

寫了個小爬蟲,用axios.all同時請求多個頁面時,國內網路的原因很容易就超時然後reject了,佛系resolve不可取啊,然後想到可以實現一個“重發失敗請求”的功能。 Promise.all(requestPromises).then(…).catch(…) 會在所有request

移動端1px邊框線在iPhone6,iPhone7變粗的處理方法

開發過移動端頁面的朋友都知道,在程式碼頭部應該加入這樣一句話: <meta name="viewport" content = "width=device-width,initial-scale = 1,maximum-scale = 1,minimum-scale = 1,u

java字串比較--compareTo方法

java.lang.String.compareTo()方法比較兩個字串的字典,比較是基於字串中的每個字元的Unicode值 String n1 = "1"; String n2 = "0.15656655856565"; String m1 = "a"; String m2 = "b"; Strin

強烈推薦:Java程式設計過程正確的異常處理方法

  Java程式設計過程中的異常處理是一個很常見的話題,幾乎任何一門介紹性的Java課程都會提到異常處理。不過,我認為很多人其實並沒有真正掌握正確處理異常情況的方法和策略,最多也就瞭解個大概,知道點概念。 首先我來解釋一些java異常處理中必須搞清楚的定義和機制吧。Java語

lua的常用字串處理方法

對lua中string類庫中常用方法總結一二: 1、數字和字串相加減lua自動轉換: 2、#得到字串的長度: 3、string.byte:返回字元的內部數字編碼(ASCII碼) 4、string.

碎片處理方法OPTIMIZE

來看看手冊中關於 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了很多

R種常用並行方法——1. parallel

由於最近在進行一些論文的模擬,所以嘗試了兩種並行的方法:parallel與snowfall,這兩種方法各有優缺,但還是推薦snowfall,整體較為穩定,不容易因為記憶體不足或者並行執行緒過多等原因而報錯。 平行計算 平行計算: 簡單來講,就是同時使

oracle修改名的方法

方法1:利用alter命令直接修改 SQL>ALTER TABLE old_table_name RENAME TO new_table_name;(大寫為系統命令) 方法2:利用rename命

MYSQL的datetime的處理方法

datetime 日期和時間部分,可以精確到毫秒。所以在處理介面時,往往精確到秒就行了。因此,在SQL中可以這樣處理: date_format(mo.AlertDate,'%Y-%c-%d %h:%i

helm-chart的特殊符號處理方法

helm 處理特殊符號 : 前面加 \\\ 如下面,key :users 的value 帶有雙引號,就要特殊處理: value.yml game: users: "{:username \\\"賬號100\\\" :password xxxxxxeeeeee}" d

selenium+webdriver+python 警告框的處理方法

在自動化測試過程中,經常會遇到彈出警告框的情況,如圖所示: 在 WebDriver 中處理 JavaScript 所生成的 alert、confirm 以及 prompt 是很簡單的。具體做法是使