Pig哲學之一——Pigs Eat Anything。Pig能夠從不同數據源加載數據,能夠處理不同式的數據。Pig使用Loader/Store進行數據加載和存儲,可選地使用Schema指定數據列名稱和類型。如果加載數據時不指定Schema,數據列未命名,類型默認是字節數組(bytearray),在后
Pig哲學之一——Pigs Eat Anything。Pig能夠從不同數據源加載數據,能夠處理不同格式的數據。Pig使用Loader/Store進行數據加載和存儲,可選地使用Schema指定數據列名稱和類型。如果加載數據時不指定Schema,數據列未命名,類型默認是字節數組(bytearray),在后續操作中,Pig可以通過位置參數引用數據列,會根據在數據列上進行的操作進行自動類型轉化。從性能和可讀性考慮,最好在加載數據時指定Schema。
Loader的基類是org.apache.pig.LoadFunc,規定了Loader需要實現的接口,并提供了一些默認實現。下圖是Loader的繼承體系,針對不同數據源,Pig實現了大量Loader,包括HBaseStorage和ParquestLoader等,能夠處理列式存儲。默認的Loader是PigStorage。
org.apache.pig.LoadFunc中的三個基本的方法決定了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) 處理壓縮格式,通過加載文件后綴加載不同的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
通過實現其他一些接口,Loader能提供一些附加功能
在使用RCFile等基于列格式文件時,如果每次都加載所有列對性能影響較大。如果實現了LoadPushDown接口,優化器會將所需要用到的字段傳遞給pushProjection方法。
自定義字節數組到Schema中數據類型的轉換,通過一系列方法能夠自定義字節數組到到Pig的標量和復雜數據類型的轉化。默認實現為Utf8StorageConverter,其中的復雜數據類型格式固定,比如元組格式為(),map格式為[],bag為{}。
與org.apache.pig.LoadFunc對應,Pig中也存在org.apache.pig.StoreFunc抽象類。由于不少Loader(比如默認的PigStorage)同樣實現了store功能,受Java單繼承的限制,Pig提供了StoreFuncInterface接口。
Store的實現與Loader對應,將實際輸出操作委托給OutputFormat。值得注意的是,與LoadMetadata對應,Pig也提供了StoreMetadata接口用于處理元數據的存儲。.
Schema描述了一個數據集合每一行的列名稱和數據類型,其中每一個列信息用FieldSchema表示。FieldSchema通常包括列名稱、數據類型,如果列本身是bag的話,FieldSchema還會擁有自己的Schema。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com