注:本文涉及書中4.5小結(jié)
基于文件的數(shù)據(jù)結(jié)構(gòu)
有兩種文件格式:?
1. SequenceFile?
2. MapFile
· SequenceFile
SequenceFile為二進(jìn)制鍵/值提供了一個(gè)持久數(shù)據(jù)結(jié)構(gòu),適合日志文件。
可以把SequenceFile當(dāng)做一個(gè)容器,把所有文件打包到SequenceFile類中可以高效的對(duì)小文件進(jìn)行存儲(chǔ)和處理。
1. SequenceFile的寫操作
通過createWriter()靜態(tài)方法可以創(chuàng)建SequenceFile對(duì)象,并返回SequenceFile.writer實(shí)例。
SequenceFile中的key和value可以是任意類型Writable或者是自定義Writable類型。
補(bǔ)充
結(jié)合4.5.1小節(jié)范例4-14,SequenceFile的寫操作的步驟如下:
1)創(chuàng)建Configuration?
2)獲取FileSystem?
3)創(chuàng)建文件輸出路徑Path?
4)調(diào)用SequenceFile.createWriter得到SequenceFile.Writer對(duì)象?
5)調(diào)用SequenceFile.Writer.append追加寫入文件?
6)關(guān)閉流?
2.?SequenceFile的讀操作
創(chuàng)建SequenceFile.Reader實(shí)例,然后反復(fù)調(diào)用next()方法迭代讀取記錄。
補(bǔ)充
結(jié)合4.5.1小節(jié)范例4-15,SequenceFile的讀操作的步驟如下:
1)創(chuàng)建Configuration?
2)獲取FileSystem?
3)創(chuàng)建文件輸出路徑Path?
4)new一個(gè)SequenceFile.Reader進(jìn)行讀取?
5)得到keyClass和valueClass?
6)關(guān)閉流
同步點(diǎn):指數(shù)據(jù)讀取的實(shí)例出錯(cuò)后能夠再一次與記錄邊界同步的數(shù)據(jù)流中的一個(gè)位置。
參考:https://blog.csdn.net/scgaliguodong123_/article/details/46391061
順序文件中搜索給定位置的兩種方法:
法1. 調(diào)用seek()方法
法2. 通過同步點(diǎn)查找記錄邊界:SequenceFile.Writer對(duì)象的sync(long position)方法可以將讀取位置定位到position之后的下一個(gè)同步點(diǎn)。如果position之后沒有同步了,則指向文件末尾。
3. SequenceFile的排序和合并方法
法1. MapReduce是對(duì)多個(gè)順序文件進(jìn)行排序或合并的最有效的方法。
法2. 使用SequenceFile.Sorter類中的sort()方法和merge()方法。
4. SequenceFile的格式
順序文件有文件頭和隨后的一條或多條記錄組成,記錄之間有同步標(biāo)識(shí)位。記錄的內(nèi)部結(jié)構(gòu)取決于是否啟用壓縮。如下圖。
塊壓縮(block compression)指一次性壓縮多條記錄。與單條記錄壓縮相比,壓縮率更高。每一個(gè)新塊的開始處都要插入同步標(biāo)識(shí)。如圖。
· MapFile
MapFile是已經(jīng)排過序的SequenceFile,它有索引,可以按鍵值查找。
1. MapFile的寫操作
新建一個(gè)MapFile.Writer實(shí)例,然后調(diào)用append()方法順序?qū)懭胛募?nèi)容。鍵必須是WritableComparable類型的實(shí)例,值必須是Writable類型的實(shí)例。
2. MapFile的讀操作
(1)新建一個(gè)MapFile.Reader實(shí)例,然后調(diào)用next()方法,直到返回值為false,說明已讀到文件尾。
(2)還可以用get()方法訪問文件中指定key對(duì)應(yīng)的數(shù)據(jù)。如果返回null,說明指定key沒有相應(yīng)的條目。
(3)還可以用getClosest()方法訪問文件中指定key對(duì)應(yīng)的數(shù)據(jù)。但在不匹配時(shí),不會(huì)返回null,而是返回與指定鍵匹配的最接近的鍵。
3. MapFile的變種
(1)SetFile:用于存儲(chǔ)Writable鍵的集合,鍵必須按照拍好的順序添加。
(2)ArrayFile:鍵是一個(gè)整型,表示數(shù)組中元素的索引;值是一個(gè)Writable值。
(3)BloomMapFile:特別適用于稀疏文件。該實(shí)現(xiàn)使用一個(gè)動(dòng)態(tài)的bloom過濾器來檢測(cè)某個(gè)給定的鍵是否在map文件中,如果存在相應(yīng)結(jié)果,則調(diào)用get()方法。
· 將SequenceFile轉(zhuǎn)換為MapFile
MapFile相當(dāng)于加入了索引和排過序的SequenceFile
本書4.5.1小節(jié)part4展示了如何對(duì)SequenceFile文件進(jìn)行排序和合并
4.5.2小節(jié)的范例4-17展示了如何創(chuàng)建索引