Pig哲學(xué)之一——Pigs Eat Anything。Pig能夠從不同數(shù)據(jù)源加載數(shù)據(jù),能夠處理不同式的數(shù)據(jù)。Pig使用Loader/Store進(jìn)行數(shù)據(jù)加載和存儲(chǔ),可選地使用Schema指定數(shù)據(jù)列名稱(chēng)和類(lèi)型。如果加載數(shù)據(jù)時(shí)不指定Schema,數(shù)據(jù)列未命名,類(lèi)型默認(rèn)是字節(jié)數(shù)組(bytearray),在后
Pig哲學(xué)之一——Pigs Eat Anything。Pig能夠從不同數(shù)據(jù)源加載數(shù)據(jù),能夠處理不同格式的數(shù)據(jù)。Pig使用Loader/Store進(jìn)行數(shù)據(jù)加載和存儲(chǔ),可選地使用Schema指定數(shù)據(jù)列名稱(chēng)和類(lèi)型。如果加載數(shù)據(jù)時(shí)不指定Schema,數(shù)據(jù)列未命名,類(lèi)型默認(rèn)是字節(jié)數(shù)組(bytearray),在后續(xù)操作中,Pig可以通過(guò)位置參數(shù)引用數(shù)據(jù)列,會(huì)根據(jù)在數(shù)據(jù)列上進(jìn)行的操作進(jìn)行自動(dòng)類(lèi)型轉(zhuǎn)化。從性能和可讀性考慮,最好在加載數(shù)據(jù)時(shí)指定Schema。
Loader的基類(lèi)是org.apache.pig.LoadFunc,規(guī)定了Loader需要實(shí)現(xiàn)的接口,并提供了一些默認(rèn)實(shí)現(xiàn)。下圖是Loader的繼承體系,針對(duì)不同數(shù)據(jù)源,Pig實(shí)現(xiàn)了大量Loader,包括HBaseStorage和ParquestLoader等,能夠處理列式存儲(chǔ)。默認(rèn)的Loader是PigStorage。
org.apache.pig.LoadFunc中的三個(gè)基本的方法決定了Where/What/How:
public abstractvoidsetLocation(String location, Job job) throws IOException public abstractInputFormat getInputFormat() throws IOException public LoadCaster getLoadCaster() throws IOException { return new Utf8StorageConverter(); }
1) 處理壓縮格式,通過(guò)加載文件后綴加載不同的InputFormat:
@Override public InputFormat getInputFormat() { if(loadLocation.endsWith(".bz2") || loadLocation.endsWith(".bz")) { return newBzip2TextInputFormat(); } else { return newPigTextInputFormat(); } }
public void prepareToRead(RecordReader reader,PigSplit split) @Override public Tuple getNext() throws IOException
通過(guò)實(shí)現(xiàn)其他一些接口,Loader能提供一些附加功能
在使用RCFile等基于列格式文件時(shí),如果每次都加載所有列對(duì)性能影響較大。如果實(shí)現(xiàn)了LoadPushDown接口,優(yōu)化器會(huì)將所需要用到的字段傳遞給pushProjection方法。
自定義字節(jié)數(shù)組到Schema中數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,通過(guò)一系列方法能夠自定義字節(jié)數(shù)組到到Pig的標(biāo)量和復(fù)雜數(shù)據(jù)類(lèi)型的轉(zhuǎn)化。默認(rèn)實(shí)現(xiàn)為Utf8StorageConverter,其中的復(fù)雜數(shù)據(jù)類(lèi)型格式固定,比如元組格式為(),map格式為[],bag為{}。
與org.apache.pig.LoadFunc對(duì)應(yīng),Pig中也存在org.apache.pig.StoreFunc抽象類(lèi)。由于不少Loader(比如默認(rèn)的PigStorage)同樣實(shí)現(xiàn)了store功能,受Java單繼承的限制,Pig提供了StoreFuncInterface接口。
Store的實(shí)現(xiàn)與Loader對(duì)應(yīng),將實(shí)際輸出操作委托給OutputFormat。值得注意的是,與LoadMetadata對(duì)應(yīng),Pig也提供了StoreMetadata接口用于處理元數(shù)據(jù)的存儲(chǔ)。.
Schema描述了一個(gè)數(shù)據(jù)集合每一行的列名稱(chēng)和數(shù)據(jù)類(lèi)型,其中每一個(gè)列信息用FieldSchema表示。FieldSchema通常包括列名稱(chēng)、數(shù)據(jù)類(lèi)型,如果列本身是bag的話,F(xiàn)ieldSchema還會(huì)擁有自己的Schema。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com