日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Pig基本原理

發(fā)布時(shí)間:2023/12/20 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pig基本原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Pig基本原理

Pig是一款數(shù)據(jù)裝載、處理、存儲(chǔ)的工具。我們可以使用pig將數(shù)據(jù)裝載到內(nèi)存中成為一個(gè)關(guān)系,然后再通過(guò)PigLatin語(yǔ)言對(duì)數(shù)據(jù)進(jìn)行操作,最后再將數(shù)據(jù)轉(zhuǎn)換的結(jié)果存儲(chǔ)到一個(gè)文件中。它的底層事實(shí)上是MR的任務(wù),所以會(huì)具備MR的各個(gè)特性。

Pig的組成

Pig由兩部分組成

  • Pig Latin是Pig處理數(shù)據(jù)所用到的語(yǔ)言。
  • Pig運(yùn)行的環(huán)境,在單機(jī)模式下運(yùn)行環(huán)境下為JVM,在集群模式下為Hadoop Cluster。(因?yàn)樗褪且粋€(gè)MR所以可以運(yùn)行在YARN上面)。

?

Pig的操作方式

  • 在shell下運(yùn)行(Grunt)。
  • 寫(xiě)腳本,(xxx.pig)。
  • 使用Java語(yǔ)言進(jìn)行操作,(就像是JDBC一樣)。

?

Pig與普通數(shù)據(jù)庫(kù)的區(qū)別

  • PigLatin語(yǔ)句是一行一行的進(jìn)行執(zhí)行,不像SQL一樣它有一些嵌套。但是SQL的底層與PigLatin是一樣的,SQL語(yǔ)句在表面上是嵌套的但是在底層也是一句一句去執(zhí)行的。
  • PigLatin模式的定義很靈活,模式也就是數(shù)據(jù)的約束。在SQL中往往是先創(chuàng)建表然后再插入數(shù)據(jù)。但是Pig作為一款數(shù)據(jù)處理工具它的情況就是先有數(shù)據(jù)然后在數(shù)據(jù)上添加對(duì)應(yīng)字段的名稱(chēng)與屬性。
  • SQL中只能夠有平坦的數(shù)據(jù)結(jié)構(gòu),而在Pig中會(huì)有嵌套的數(shù)據(jù)結(jié)構(gòu)。
  • Pig基于MR所以不支持隨機(jī)IO而SQL支持隨機(jī)IO。

?

PigLatin基本介紹

基本組成與特征

一個(gè)PigLatin程序是由一組PigLatin語(yǔ)句組成。大小寫(xiě)敏感,每一句最后都以分號(hào)結(jié)尾。其中所有的一行行的語(yǔ)句都是為了構(gòu)建一個(gè)查詢計(jì)劃。在構(gòu)建查詢計(jì)劃時(shí)語(yǔ)句是不會(huì)執(zhí)行的。在構(gòu)建完成之后Pig就會(huì)做一個(gè)整體的優(yōu)化。比如我們?cè)谏弦痪洳樵兞?000條數(shù)據(jù)然后下面會(huì)給出一些條件去過(guò)濾掉一些數(shù)據(jù)。這樣的話我們就可以直接去追求那些最終的數(shù)據(jù)從而省略掉中間的步驟。最后在使用比如說(shuō)DUMP語(yǔ)句的時(shí)候再去將邏輯計(jì)劃轉(zhuǎn)換成物理計(jì)劃再執(zhí)行。需要注意的是如果中間出現(xiàn)了一個(gè)錯(cuò)誤的語(yǔ)法那么邏輯計(jì)劃的搭建就會(huì)終止。

多查詢執(zhí)行

在批處理下還有一個(gè)隱藏的優(yōu)化點(diǎn)就是多查詢執(zhí)行就是一個(gè)執(zhí)行的結(jié)果可以多個(gè)過(guò)程所引用。在交互式的環(huán)境下STORE、DUMP命令總是會(huì)觸發(fā)語(yǔ)句的執(zhí)行,各個(gè)操作之間彼此隔離他們內(nèi)部會(huì)包含run語(yǔ)句,執(zhí)行的結(jié)果不能重用。但是批處理下的STORE操作就能夠?qū)崿F(xiàn)多查詢執(zhí)行它內(nèi)部包含exec語(yǔ)句。

?

有些語(yǔ)句并不會(huì)處理數(shù)據(jù)比如說(shuō)導(dǎo)包或者是注冊(cè)語(yǔ)句,由于它不會(huì)處理語(yǔ)句的特性所以他們不會(huì)像執(zhí)行計(jì)劃一樣最后才執(zhí)行,相反他們會(huì)立即執(zhí)行。

?

關(guān)系——語(yǔ)句執(zhí)行的結(jié)果

當(dāng)我們把文件中的數(shù)據(jù)通過(guò)PigLatin裝載到內(nèi)存中的時(shí)候,當(dāng)我們將數(shù)據(jù)執(zhí)行了一些操作的時(shí)候,我們會(huì)把這個(gè)數(shù)據(jù)稱(chēng)作為關(guān)系,它在內(nèi)存中它而且可能具有復(fù)雜嵌套的結(jié)構(gòu)。在結(jié)構(gòu)方面它與Pig中的包(本質(zhì)上也是一個(gè)復(fù)雜嵌套的數(shù)據(jù)結(jié)構(gòu))一樣。但是Pig賦予他們的操作是不同的。

?

PigLatin的表達(dá)式

詳見(jiàn)文檔

PigLatin的數(shù)據(jù)類(lèi)型

在PigLatin中沒(méi)有一種數(shù)據(jù)對(duì)飲Java中的byte、short、char。字符串使用chararray來(lái)表示,其它整數(shù)類(lèi)型與Java的基本類(lèi)似。除此之外還有一些復(fù)雜的類(lèi)型,tuple元組、bag包、map映射。如果在裝載數(shù)據(jù)時(shí)沒(méi)有指定類(lèi)型那么默認(rèn)的數(shù)據(jù)類(lèi)型就是bytearray。

其它詳見(jiàn)文檔。

PigLatin的模式

模式簡(jiǎn)單來(lái)說(shuō)就是字段名稱(chēng)+字段類(lèi)型。上面我們已經(jīng)提到,SQL中會(huì)現(xiàn)有模式然后再有數(shù)據(jù)。但是Pig是一個(gè)數(shù)據(jù)處理工具所以會(huì)在已有的數(shù)據(jù)上添加對(duì)應(yīng)的模式。但是我們也可以不去定義模式,通過(guò)$[數(shù)字]來(lái)引用獲取數(shù)據(jù),此時(shí)獲取到的所有數(shù)據(jù)的類(lèi)型都是bytearray類(lèi)型。

模式重用

Pig的模式十分的靈活,我們可以在任意一個(gè)操作之前重新定義我們所需要的模式,但是這也帶來(lái)了一些負(fù)擔(dān)。因?yàn)橛行┠J讲皇敲看味夹枰x因?yàn)樗c上一次的模式是一樣的。但是Pig本身是不能夠?qū)崿F(xiàn)模式的重用的,這時(shí)就能夠使用HCatalog來(lái)利用Hive的matestore來(lái)存儲(chǔ)模式進(jìn)而達(dá)到模式重用。

驗(yàn)證與空值

實(shí)務(wù)上我們采集到的數(shù)據(jù)可能是殘缺的不完整的或者是格式錯(cuò)誤的,這時(shí)候我們可能使用過(guò)濾操作把它過(guò)濾掉。當(dāng)然沒(méi)有明確的手段去處理這些事情可以說(shuō)是非常的靈活。

模式合并

在SQL中我們?cè)谝恍┎僮髦髸?huì)得到新的模式比如說(shuō)把兩張表連接。Pig中不用為每個(gè)新產(chǎn)生的關(guān)系申明模式。大多數(shù)情況下會(huì)根據(jù)輸入的模式來(lái)確定輸出的模式。但是模式的合并可能會(huì)比較復(fù)雜當(dāng)數(shù)據(jù)橫向合并的時(shí)候會(huì)由于兩組數(shù)據(jù)字段的個(gè)數(shù)不同而不兼容。

?

PigLatin函數(shù)

計(jì)算函數(shù)

這里著重強(qiáng)調(diào)聚集函數(shù)中的代數(shù)函數(shù),代數(shù)函數(shù)可以有進(jìn)一步的優(yōu)化。比如說(shuō)求最大值這種運(yùn)算,幾個(gè)小組的最大值的最大值就是所有數(shù)的最大值。但是幾個(gè)小組的中位數(shù)的中位數(shù)就不是全體數(shù)字的中位數(shù)。前一個(gè)計(jì)算就屬于代數(shù)函數(shù)。

過(guò)濾函數(shù)

過(guò)濾函數(shù)的底層是一個(gè)判斷,返回值是一個(gè)boolean。滿足要求的就返回true否則就返回false這樣的話返回為true的值會(huì)留下來(lái)。

加載函數(shù)

加載函數(shù)會(huì)指明如何從外部存儲(chǔ)加載到一個(gè)關(guān)系。

存儲(chǔ)函數(shù)

如何把一個(gè)關(guān)系中的數(shù)據(jù)存儲(chǔ)到外部存儲(chǔ)。通常加載和存儲(chǔ)會(huì)由相同的類(lèi)來(lái)實(shí)現(xiàn)。

就是一些函數(shù)或者是操作的封裝。一個(gè)宏可以打包一段PigLatin的代碼。使用$前綴進(jìn)行引用,在運(yùn)行的時(shí)候會(huì)展開(kāi)宏。

UDF自定義函數(shù)

過(guò)濾UDF

所有的UDF都是EvalFunc的實(shí)現(xiàn)類(lèi)(直接或者間接)。在調(diào)用的時(shí)候我們會(huì)使用類(lèi)名加參數(shù),這也是為什么Pig中會(huì)嚴(yán)格的區(qū)分大小寫(xiě)。由于UDF在Java語(yǔ)言描述的情況下會(huì)在執(zhí)行的時(shí)候以jar包的方式運(yùn)行,所以會(huì)在運(yùn)行時(shí)將jar文件傳輸?shù)郊骸?/p>

我們也可以利用UDF來(lái)告訴Pig所期望的各個(gè)字段的值。重寫(xiě)EvalFunc的getArgToFuncMapping()方法。

?

計(jì)算UDF

只是繼承不同的類(lèi)而已,在動(dòng)態(tài)調(diào)用中如果用到了Java中的代碼的話我們就會(huì)使用反射技術(shù)同時(shí)使用Method的InvokeXX來(lái)調(diào)用。

?

加載UDF

Pig數(shù)據(jù)的加載會(huì)先于mapper的運(yùn)行,所以保證數(shù)據(jù)可以被分割成各個(gè)獨(dú)立的mapper是十分重要的。在遇到損壞的數(shù)據(jù)的時(shí)候通常會(huì)采取返回null的策略。我們可以在類(lèi)中定義類(lèi)的模式但需要注意的是AS中所定義的模式的優(yōu)先級(jí)會(huì)高于在函數(shù)中的優(yōu)先級(jí)。

?

數(shù)據(jù)處理

加載和存儲(chǔ)

常見(jiàn)的調(diào)用默認(rèn)的存儲(chǔ)函數(shù),比如說(shuō)PigStorage。

數(shù)據(jù)的過(guò)濾

  • 最常見(jiàn)的就是FOREACH … GENERATE操作

新關(guān)系 = FOREACH 舊關(guān)系 GENERATE 舊關(guān)系中的字段的一些處理,當(dāng)然也包含我們的添加字段。

  • STREAM操作主要是提供了腳本或者外部程序操作的一種可能。

數(shù)據(jù)的分組與連接

  • JOIN,就是通過(guò)兩個(gè)數(shù)據(jù)集的某一個(gè)關(guān)聯(lián)字段來(lái)進(jìn)行連接。如果連接的關(guān)系太大不能放全部放在內(nèi)存中,則可以使用普通的連接操作。如果有一個(gè)關(guān)系小到可以放在內(nèi)存中那么就使用分段復(fù)制連接。它同樣支持類(lèi)似于SQL中的內(nèi)連接,外連接。
  • COGROUP,就是一個(gè)能夠產(chǎn)生復(fù)雜嵌套數(shù)據(jù)結(jié)構(gòu)的JOIN。
  • CROSS,就是PigLatin中的笛卡爾積。這個(gè)場(chǎng)景經(jīng)常應(yīng)用于計(jì)算相似度但是隨著我們對(duì)業(yè)務(wù)的進(jìn)一步了解,我們會(huì)減少一些表之間的笛卡爾積來(lái)避免無(wú)效的運(yùn)算。
  • GROUP與SQL中的GROUP類(lèi)似,這樣的話會(huì)按照一個(gè)指標(biāo)去聚合數(shù)據(jù)。

另外排序與數(shù)據(jù)的組合或者是拆分與SQL基本類(lèi)似。合并會(huì)由于字段的不一致所導(dǎo)致模式的混亂,如果字段值的個(gè)數(shù)不一致的話那么就或?qū)е聸](méi)有模式。同樣分割也是按照一定的指標(biāo)去實(shí)現(xiàn)數(shù)據(jù)分離(IF … OTHERWISE…)。

Pig Trick

  • 運(yùn)行在MR模式下,我們需要做的最重要的一件事就是處理的并行度與所處理的數(shù)據(jù)集大小匹配。一種好的方式就是參數(shù)設(shè)置成稍微小于急群中reduce任務(wù)時(shí)的slot的個(gè)數(shù)。
  • 有一些值會(huì)隨著運(yùn)行時(shí)間的不同而改變,這時(shí)我們就使用參數(shù)代換來(lái)動(dòng)態(tài)的改變參數(shù)。

總結(jié)

以上是生活随笔為你收集整理的Pig基本原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。