最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

Pig系統(tǒng)分析(2)

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 15:51:05
文檔

Pig系統(tǒng)分析(2)

Pig系統(tǒng)分析(2):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ù)組(bytearra
推薦度:
導(dǎo)讀Pig系統(tǒng)分析(2):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ù)組(bytearra

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體系

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. 指定加載位置。
  2. 指定數(shù)據(jù)源類(lèi)型,使用HDFS的InputFormat處理不同數(shù)據(jù)源。
  3. 如何處理數(shù)據(jù)從字節(jié)數(shù)組到實(shí)際類(lèi)型的轉(zhuǎn)化,默認(rèn)使用Utf8StorageConverter

PigStore分析

1) 處理壓縮格式,通過(guò)加載文件后綴加載不同的InputFormat:

@Override
public InputFormat getInputFormat() {
 if(loadLocation.endsWith(".bz2") || loadLocation.endsWith(".bz")) {
 return newBzip2TextInputFormat();
 } else {
 return newPigTextInputFormat();
 }
}
2) 讀取數(shù)據(jù):讀取數(shù)據(jù)之前先代用prepareToRead方法設(shè)置InputFormat對(duì)應(yīng)的RecordReader,通過(guò)RecordReader讀取每行數(shù)據(jù),根據(jù)用戶(hù)指定的分隔符處理每行文本,最終轉(zhuǎn)換成元組。
public void prepareToRead(RecordReader reader,PigSplit split)
@Override
public Tuple getNext() throws IOException

3) Schema處理,在getNext方法中,如果存在Schema,會(huì)對(duì)元組應(yīng)用applySchema方法,給元組中的數(shù)據(jù)項(xiàng)指定名稱(chēng)和類(lèi)型。

其他重要接口

通過(guò)實(shí)現(xiàn)其他一些接口,Loader能提供一些附加功能

LoadMetaData

  1. 通過(guò)getSchema方法自動(dòng)加載Schema
  2. 通過(guò)getPartitionKeys方法設(shè)置數(shù)據(jù)的分區(qū)鍵,把用戶(hù)查詢(xún)條件中的分區(qū)鍵通過(guò)setPartitionFilter直接傳遞給Loader,減少數(shù)據(jù)加載。參見(jiàn)HCatLoader中實(shí)現(xiàn),注:org.apache.hcatalog.pig.HCatLoader

LoadPushDown

在使用RCFile等基于列格式文件時(shí),如果每次都加載所有列對(duì)性能影響較大。如果實(shí)現(xiàn)了LoadPushDown接口,優(yōu)化器會(huì)將所需要用到的字段傳遞給pushProjection方法。

LoadCaster

自定義字節(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為{}。

Store體系

與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結(jié)構(gòu)

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。


參考價(jià)值

  1. 目前Pig針對(duì)邏輯執(zhí)行計(jì)劃的優(yōu)化器都是基于規(guī)則的,如果要實(shí)現(xiàn)基于代價(jià)的優(yōu)化,需要更多關(guān)于數(shù)據(jù)的統(tǒng)計(jì)信息,那么加載和存儲(chǔ)數(shù)據(jù)應(yīng)該是重要入口和出口。在LoadMetadata/StoreMetadata接口中已經(jīng)存在getStatistics/setStatistics方法,ResourceStatistics包含行數(shù)、行大小、列直方圖、區(qū)分度等統(tǒng)計(jì)信息,不過(guò)現(xiàn)在在PigStorage中是空實(shí)現(xiàn)。
  2. 如果要實(shí)現(xiàn)Pig On Spark,Loader體系中需要加入RDD層,演變?yōu)長(zhǎng)oader-RDD-HDFS三層結(jié)構(gòu)。HDFS存儲(chǔ)可以考慮ORCFile等列式存儲(chǔ)格式,基于成本的優(yōu)化可以參考Hive中的實(shí)現(xiàn)

聲明:本網(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

文檔

Pig系統(tǒng)分析(2)

Pig系統(tǒng)分析(2):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ù)組(bytearra
推薦度:
標(biāo)簽: 系統(tǒng) 分析 哲學(xué)
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top