hadoop data join
概念:
Hadoop有一個(gè)叫DataJoin的包為Data Join提供相應(yīng)的框架。它的Jar包存在于contrib/datajoin/hadoop-*-datajoin。
為區(qū)別于其他的data join技術(shù),我們稱其為reduce-side join。(因?yàn)槲覀冊(cè)?span id="nb03ufmfr74b_10" class="nb03ufmfr74b" style="font-weight:bold;">reducer上作大多數(shù)的工作)
reduce-side join引入了一些術(shù)語及概念:
? ? ? ? ? ? 1.Data Source:基本與關(guān)系數(shù)據(jù)庫中的表相似,形式為:(例子中為CSV格式)
Customers ?Orders
1,Stephanie Leung,555-555-5555 3,A,12.95,02-Jun-2008
2,Edward Kim,123-456-7890 ?1,B,88.25,20-May-2008
3,Jose Madriz,281-330-8004 ?2,C,32.00,30-Nov-2007
4,David Stork,408-555-0000 ?3,D,25.02,22-Jan-2009
? ? ? ? ? ? 2.Tag:由于記錄類型(Customers或Orders)與記錄本身分離,標(biāo)記一個(gè)Record會(huì)確保特殊元數(shù)據(jù)會(huì)一致存在于記錄中。在這個(gè)目的下,我們將使用每個(gè)record自身的Data source名稱標(biāo)記每個(gè)record。
? ? ? ? ? ? 3.Group Key:Group Key類似于關(guān)系數(shù)據(jù)庫中的鏈接鍵(join key),在我們的例子中,group key就是Customer ID(第一列的3)。由于datajoin包允許用戶自定義group key,所以其較之關(guān)系數(shù)據(jù)庫中的join key更一般、平常。
流程:(詳見《Hadoop in Action》Chapter 5.2)
Advanced MapReduce:
Joining Data from different sources:
利用datajoin包來實(shí)現(xiàn)join:
Hadoop的datajoin包中有三個(gè)需要我們繼承的 類:DataJoinMapperBase,DataJoinReducerBase,TaggedMapOutput。正如其名字一樣,我們的 MapClass將會(huì)擴(kuò)展DataJoinMapperBase,Reduce類會(huì)擴(kuò)展DataJoinReducerBase。這個(gè)datajoin包 已經(jīng)實(shí)現(xiàn)了map()和reduce()方法,因此我們的子類只需要實(shí)現(xiàn)一些新方法來設(shè)置一些細(xì)節(jié)。
在用DataJoinMapperBase和DataJoinReducerBase之前,我們需要弄清楚我們貫穿整個(gè)程序使用的新的虛數(shù)據(jù)類TaggedMapOutput。
根據(jù)之前我們?cè)趫DAdvance MapReduce的數(shù)據(jù)流中所展示的那樣,mapper輸出一個(gè)包(由一個(gè)key和一個(gè)value(tagged record)組成)。datajoin包將key設(shè)置為Text類型,將value設(shè)置為TaggedMapOutput類型 (TaggedMapOutput是一個(gè)將我們的記錄使用一個(gè)Text類型的tag包裝起來的數(shù)據(jù)類型)。它實(shí)現(xiàn)了getTag()和setTag(Text tag) 方法。它還定義了一個(gè)getData()方法,我們的子類將實(shí)現(xiàn)這個(gè)方法來處理record記錄。我們并沒有明確地要求子類實(shí)現(xiàn)setData()方法, 但我們最好還是實(shí)現(xiàn)這個(gè)方法以實(shí)現(xiàn)程序的對(duì)稱性(或者在構(gòu)造函數(shù)中實(shí)現(xiàn))。作為Mapper的輸出,TaggedMapOutput需要是 Writable類型,因此的子類還需要實(shí)現(xiàn)readFields()和write()方法。
DataJoinMapperBase:
回憶join數(shù)據(jù)流圖,mapper的主要功能就是打包一個(gè)record使其能夠和其他擁有相同group key的記錄去向一個(gè)Reducer。DataJoinMapperBase完成所有的打包工作,這個(gè)類定義了三個(gè)虛類讓我們的子類實(shí)現(xiàn):
protected abstract Text generateInputTag(String inputFile);
protected abstract TaggedMapOutput generateTaggedMapOutut(Object value);
protected abstract Text generateGroupKey(TaggedMapOutput aRecored);
在一個(gè)map任務(wù)開始之前為所有這個(gè)map任務(wù)會(huì)處理的記錄定義一個(gè)tag(Text),結(jié)果將保存到DataJoinMapperBase的inputTag變量中,我們也可以保存filename至inputFile變量中以待后用。
在map任務(wù)初始化之后,DataJoinMapperBase的map()方法會(huì)對(duì)每一個(gè)記錄執(zhí)行。它調(diào)用了兩個(gè)我們還沒有實(shí)現(xiàn)的虛方法:generateTaggedMapOutput()以及generateGroupKey(aRecord);(詳見代碼)
DataJoinReducerBase:
DataJoinMapperBase將我們所需要做的工作以一個(gè)full outer join的方式簡(jiǎn)化。我們的Reducer子類只需要實(shí)現(xiàn)combine()方法來濾除掉我們不需要的組合來得到我們需要的(inner join, left outer join等)。同時(shí)我們也在combiner()中將我們的組合格式化為輸出格式。
轉(zhuǎn)載于:https://www.cnblogs.com/xiongjianjunjava/p/3939261.html
總結(jié)
以上是生活随笔為你收集整理的hadoop data join的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ECMAScript5 ES5
- 下一篇: HDU 2128 Tempter of