云計算PIG的使用_第1頁
云計算PIG的使用_第2頁
云計算PIG的使用_第3頁
云計算PIG的使用_第4頁
云計算PIG的使用_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

-.z.云計算pig使用Hadoop的普及和其生態(tài)系統(tǒng)的不斷壯大并不令人感到意外。Hadoop不斷進步的一個特殊領(lǐng)域是Hadoop應用程序的編寫。雖然編寫Map和Reduce應用程序并不十分復雜,但這些編程確實需要一些軟件開發(fā)經(jīng)歷。ApachePig改變了這種狀況,它在MapReduce的根底上創(chuàng)立了更簡單的過程語言抽象,為Hadoop應用程序提供了一種更加接近構(gòu)造化查詢語言(SQL)的接口。因此,您不需要編寫一個單獨的MapReduce應用程序,您可以用PigLatin語言寫一個腳本,在集群中自動并行處理與分發(fā)該腳本。

PigLatin例如讓我們從一個簡單的Pig例如開場介紹,并剖析該例如。Hadoop的一個有趣的用法是,在大型數(shù)據(jù)集中搜索滿足*個給定搜索條件的記錄〔在Linu*?中被稱為grep〕。清單1顯示了在Pig中實現(xiàn)該過程的簡單性。在所顯示的三行代碼中,只有一行是真正的搜索。第一行只是將測試數(shù)據(jù)集〔消息日志〕讀取到代表元組集合的包中。用一個正則表達式來篩選該數(shù)據(jù)〔元組中的惟一條目,表示為$0或field1〕,然后查找字符序列WARN。最后,在主機文件系統(tǒng)中將這個包存儲在一個名為warnings的新文件中,這個包現(xiàn)在代表來自消息的包含WARN的所有元組。清單1.一個簡單的PigLatin腳本

messages=LOAD'messages';

warns=FILTERmessagesBY$0MATCHES'.*WARN+.*';

STOREwarnsINTO'warnings';

如您所見,這個簡單的腳本實現(xiàn)了一個簡單的流,但是,如果直接在傳統(tǒng)的MapReduce模型中實現(xiàn)它,則需要增加大量的代碼。這使得學習Hadoop并開場使用數(shù)據(jù)比原始開發(fā)容易得多?,F(xiàn)在讓我們更深入地探討Pig語言,然后查看該語言的一些功能的其他例如。

--------------------------------------------------------------------------------

回頁首

PigLatin的根底知識

PigLatin是一個相對簡單的語言,它可以執(zhí)行語句。一調(diào)語句就是一個操作,它需要輸入一些內(nèi)容〔比方代表一個元組集的包〕,并發(fā)出另一個包作為其輸出。一個包就是一個關(guān)系,與表類似,您可以在關(guān)系數(shù)據(jù)庫中找到它〔其中,元組代表行,并且每個元組都由字段組成〕。用PigLatin編寫的腳本往往遵循以下特定格式,從文件系統(tǒng)讀取數(shù)據(jù),對數(shù)據(jù)執(zhí)行一系列操作〔以一種或多種方式轉(zhuǎn)換它〕,然后,將由此產(chǎn)生的關(guān)系寫回文件系統(tǒng)。您可以在清單1中看到該模式的最簡單形式〔一個轉(zhuǎn)換〕。

Pig擁有大量的數(shù)據(jù)類型,不僅支持包、元組和映射等高級概念,還支持簡單的數(shù)據(jù)類型,如int、long、float、double、chararray和bytearray。如果使用簡單的類型,您會發(fā)現(xiàn),除了稱為bincond的條件運算符〔其操作類似于Cternary運算符〕之外,還有其他許多算術(shù)運算符〔比方add、subtract、multiply、divide和module〕。并且,如您所期望的那樣,還有一套完整的比擬運算符,包括使用正則表達式的豐富匹配模式。所有PigLatin語句都需要對關(guān)系進展操作〔并被稱為關(guān)系運算符〕。正如您在清單1中看到的,有一個運算符用于從文件系統(tǒng)加載數(shù)據(jù)和將數(shù)據(jù)存儲到文件系統(tǒng)中。有一種方式可以通過迭代關(guān)系的行來FILTER數(shù)據(jù)。此功能常用于從后續(xù)操作不再需要的關(guān)系中刪除數(shù)據(jù)。另外,如果您需要對關(guān)系的列進展迭代,而不是對行進展迭代,您可以使用FOREACH運算符。FOREACH允許進展嵌套操作,如FILTER和ORDER,以便在迭代過程中轉(zhuǎn)換數(shù)據(jù)。

ORDER運算符提供了基于一個或多個字段對關(guān)系進展排序的功能。JOIN運算符基于公共字段執(zhí)行兩個或兩個以上的關(guān)系的內(nèi)部或外部聯(lián)接。SPLIT運算符提供了根據(jù)用戶定義的表達式將一個關(guān)系拆分成兩個或兩個以上關(guān)系的功能。最后,GROUP運算符根據(jù)*個表達式將數(shù)據(jù)分組成為一個或多個關(guān)系。表1提供了Pig中的局部關(guān)系運算符列表。表1.PigLatin關(guān)系運算符的不完整列表運算符描述

FILTER基于*個條件從關(guān)系中選擇一組元組。

FOREACH對*個關(guān)系的元組進展迭代,生成一個數(shù)據(jù)轉(zhuǎn)換。

GROUP將數(shù)據(jù)分組為一個或多個關(guān)系。

JOIN聯(lián)接兩個或兩個以上的關(guān)系〔內(nèi)部或外部聯(lián)接〕。

LOAD從文件系統(tǒng)加載數(shù)據(jù)。

ORDER根據(jù)一個或多個字段對關(guān)系進展排序。

SPLIT將一個關(guān)系劃分為兩個或兩個以上的關(guān)系。

STORE在文件系統(tǒng)中存儲數(shù)據(jù)。雖然這不是一個詳盡的PigLatin運算符清單,但該表提供了一套在處理大型數(shù)據(jù)集時非常有用的操作。您可以通過參考資料了解完整的PigLatin語言,因為Pig有一套不錯的在線文檔。現(xiàn)在嘗試著手編寫一些PigLatin腳本,以了解這些運算符的實際工作情況。

--------------------------------------------------------------------------------

回頁首獲得Pig

在有關(guān)Hadoop的早期文章中,我采用的方法是將Hadoop安裝和配置為一個軟件包。但Cloudera通過用Linu*將它打包為一個虛擬設(shè)備,使得Hadoop更易于使用。雖然它是一個較大的下載,但它已預建立并配置了虛擬機(VM),其中不僅有Hadoop,還包括了ApacheHive和Pig。因此,利用一個下載和免費提供的2型虛擬機管理程序〔VirtualBo*或基于內(nèi)核的虛擬機[KVM]〕,您便可以擁有預配置的、已準備就緒的整個Hadoop環(huán)境。

--------------------------------------------------------------------------------

回頁首讓Hadoop和Pig啟動并運行下載完您的特定虛擬機文件之后,需要為您的特定虛擬機管理程序創(chuàng)立一個VM。在參考資料中,您可以找到該操作的分步指南。

ClouderaVM內(nèi)存我發(fā)現(xiàn),僅為虛擬機分配1GB的內(nèi)存時,它無法正常工作。將該內(nèi)存分配提高至兩倍甚至三倍時,它才能夠正常運行〔也就是說,不會出現(xiàn)Java?堆內(nèi)存的問題〕。一旦創(chuàng)立了自己的VM,就可以通過VirtualBo*來啟動它,VirtualBo*引導Linu*內(nèi)核,并啟動所有必要的Hadoop守護進程。完成引導后,從創(chuàng)立一個與Hadoop和Pig通信的終端開場相關(guān)操作。您可以在兩種模式中任選一種來使用Pig。第一種是Local〔本地〕模式,它不需要依賴Hadoop或Hadoop分布式文件系統(tǒng)(HDFS),在該模式中,所有操作都在本地文件系統(tǒng)上下文中的單一Java虛擬機(JVM)上執(zhí)行。另一種模式是MapReduce模式,它使用了Hadoop文件系統(tǒng)和集群。

Local模式的Pig

對于Local模式,只需啟動Pig并用e*ectype選項指定Local模式即可。這樣做可以將您帶入Grunt外殼,使您能夠以交互方式輸入Pig語句:

$pig-*local

...

grunt>

在這里,您能夠以交互方式編寫PigLatin腳本的代碼,并查看每個運算符后面的結(jié)果。返回清單1,并嘗試使用這個腳本〔參見清單2〕。注意,在這種情況下,不需要將數(shù)據(jù)存儲到*個文件中,只需將它轉(zhuǎn)儲為一組關(guān)系。您可能會在修改后的輸出中看到,每個日志行〔與FILTER定義的搜索條件相匹配〕本身就是一個關(guān)系〔以括號[()]為界〕。清單2.在Local模式中以交互方式使用Pig

grunt>messages=LOAD'/var/log/messages';

grunt>warns=FILTERmessagesBY$0MATCHES'.*WARN+.*';

grunt>DUMPwarns

...

(Dec1003:56:43localhostNetworkManager:<WARN>nm_generic_enable_loopback():error...

(Dec1006:10:18localhostNetworkManager:<WARN>check_one_route():(eth0)error...

grunt>

如果您已經(jīng)指定STORE運算符,則它會在一個指定名稱的目錄〔而不是一個簡單的常規(guī)文件〕中生成您的數(shù)據(jù)。

Mapreduce模式中的Pig

對于MapReduce模式,必須首先確保Hadoop正在運行。要做到這一點,最簡單的方法是在Hadoop文件系統(tǒng)樹的根上執(zhí)行文件列表操作,如清單3所示。清單3.測試Hadoop可用性

$hadoopdfs-ls/

Found3items

drw*rw*rw*

-hue

supergroup

02011-12-0805:20/tmp

drw*r-*r-*

-hue

supergroup

02011-12-0805:20/user

drw*r-*r-*

-mapredsupergroup

02011-12-0805:20/var

$

如清單3所示,如果Hadoop成功運行,此代碼的結(jié)果會是一個或多個文件組成的??列表?,F(xiàn)在,讓我們來測試Pig。從啟動Pig開場,然后將目錄更改為您的HDFS根,以確定在HDFS中是否可以看到外部所看到的結(jié)果〔參見清單4〕。清單4.測試Pig

$pig

2011-12-1006:39:44,276[main]INFO

org.apache.pig.Main-Loggingerrormessagesto...

2011-12-1006:39:44,601[main]INFO

org.apache.pig....Connectingtohadoopfile\

systemat:hdfs://:8020

2011-12-1006:39:44,988[main]INFO

org.apache.pig....connectingtomap-reduce\

jobtrackerat::8021

grunt>cdhdfs:///

grunt>ls

hdfs:///tmp

<dir>

hdfs:///user

<dir>

hdfs:///var

<dir>

grunt>

到目前為止,一切都很好。您可以在Pig中看到您的Hadoop文件系統(tǒng),所以,現(xiàn)在請嘗試從您的本地主機文件系統(tǒng)將一些數(shù)據(jù)讀取到HDFS中??梢酝ㄟ^Pig將*個文件從本地復制到HDFS〔參見清單5〕。清單5.獲得一些測試數(shù)據(jù)

grunt>mkdirtest

grunt>cdtest

grunt>copyFromLocal/etc/passwdpasswd

grunt>ls

hdfs:///test/passwd<r1>1728

接下來,在Hadoop文件系統(tǒng)中測試數(shù)據(jù)現(xiàn)在是平安的,您可以嘗試另一個腳本。請注意,您可以在Pigcat文件,查看其內(nèi)容〔只是看看它是否存在〕。在這個特殊例如中,將確定在passwd文件中為用戶指定的外殼數(shù)量〔在passwd文件中的最后一列〕。要開場執(zhí)行該操作,需要從HDFS將您的passwd文件載入一個Pig關(guān)系中。在使用LOAD運算符之前就要完成該操作,但在這種情況下,您可能希望將密碼文件的字段解析為多個獨立的字段。在本例中,我們指定了PigStorage函數(shù),您可以使用它來顯示文件的分隔符〔本例中,是冒號[:]字符〕。您也可以用AS關(guān)鍵字指定獨立字段〔或架構(gòu)〕,包括它們的獨立類型〔參見清單6〕。清單6.將文件讀入一個關(guān)系中

grunt>passwd=LOAD'/etc/passwd'USINGPigStorage(':')AS(user:chararray,\

passwd:chararray,uid:int,gid:int,userinfo:chararray,home:chararray,\

shell:chararray);

grunt>DUMPpasswd;

(root,*,0,0,root,/root,/bin/bash)

(bin,*,1,1,bin,/bin,/sbin/nologin)

...

(cloudera,*,500,500,,/home/cloudera,/bin/bash)

grunt>

接下來,使用GROUP運算符根據(jù)元組的外殼將元組分組到該關(guān)系中〔參見清單7〕。再次轉(zhuǎn)儲此關(guān)系,這樣做只是為了說明GROUP運算符的結(jié)果。注意,在這里,您需要根據(jù)元組正使用的特定外殼〔在開場時指定的外殼〕對元組進展分組〔作為一個內(nèi)部包〕。清單7.將元組分組為其外殼的一個函數(shù)

grunt>grp_shell=GROUPpasswdBYshell;

grunt>DUMPgrp_shell;

(/bin/bash,{(cloudera,*,500,500,,/home/cloudera,/bin/bash),(root,*,0,0,...),...})

(/bin/sync,{(sync,*,5,0,sync,/sbin,/bin/sync)})

(/sbin/shutdown,{(shutdown,*,6,0,shutdown,/sbin,/sbin/shutdown)})

grunt>

但是,您想要的是在passwd文件中指定的獨特外殼的計數(shù)。所以,需要使用FOREACH運算符來遍歷分組中的每個元組,COUNT出現(xiàn)的數(shù)量〔參見清單8〕。清單8.利用每個外殼的計數(shù)對結(jié)果進展分組

grunt>counts=FOREACHgrp_shellGENERATEgroup,COUNT(passwd);

grunt>DUMPcounts;

...

(/bin/bash,5)

(/bin/sync,1)

(/bin/false,1)

(/bin/halt,1)

(/bin/nologin,27)

(/bin/shutdown,1)

grunt>

備注:如果要將該代碼作為一個腳本來執(zhí)行,只需將腳本輸入到*個文件中,然后使用pigmyscript.pig來執(zhí)行它。

--------------------------------------------------------------------------------

回頁首診斷運算符

Pig支持大量診斷運算符,您可以用它們來調(diào)試Pig腳本。正如您在之前的腳本例如中所看到的,DUMP運算符是無價的,它不僅可以查看數(shù)據(jù),還可以查看數(shù)據(jù)架構(gòu)。您還可以使用DESCRIBE運算符來生成一個關(guān)系架構(gòu)的詳細格式〔字段和類型〕。

E*PLAIN運算符更復雜一些,但也很有用。對于*個給定的關(guān)系,您可以使用E*PLAIN來查看如何將物理運算符分組為Map和Reduce任務〔也就是說,如何推導出數(shù)據(jù)〕。表2對PigLatin中的診斷運算符及其描述提供了一個列表。表2.PigLatin診斷運算符運算符描述

DESCRIBE返回關(guān)系的架構(gòu)。

DUMP將關(guān)系的內(nèi)容轉(zhuǎn)儲到屏幕。

E*PLAIN顯示MapReduce執(zhí)行方案。

--------------------------------------------------------------------------------

回頁首用戶定義的函數(shù)雖然Pig在本文探討的范圍內(nèi)是強大且有用的,但是通過用戶定義的函數(shù)(UDF)可以使它變得更強大。Pig腳本可以使用您為解析輸入數(shù)據(jù)、格式化輸出數(shù)據(jù)甚至運算符等定義的函數(shù)。UDF是用Java語言編寫的,允許Pig支持自定義處理。UDF是將Pig擴展到您的特定應用程序領(lǐng)域的一種方式。您可以在參考資料中了解有關(guān)UDF開發(fā)的更多信息。

--------------------------------------------------------------------------------

回頁首

Pig用戶正如您從這篇短文中可以看到的,Pig是一個強大的工具,可以在Hadoop集群中查詢數(shù)據(jù)。它是如此強大,Yahoo!估計,其Hadoop工作負載中有40%至60%由PigLatin腳本產(chǎn)生。在Yahoo!的100,000個CPU中,大約有50%的CPU仍在運行Hadoop。但Yahoo!并不是利用Pig的惟一組織。您在Twitter中也會發(fā)現(xiàn)Pig〔用于處理日志和挖掘微博數(shù)據(jù)〕;在AOL和MapQuest上也會發(fā)現(xiàn)它〔用于分析和批量數(shù)據(jù)處理〕;而在LinkedIn上,Pig用于發(fā)現(xiàn)您可能認識的人。據(jù)報道,Ebay使用Pig來實現(xiàn)搜索優(yōu)化,而adyard的推薦工具系統(tǒng)有大約一半都使用了Pig。PIG安裝Pig安裝與配置教程

Pig版塊到現(xiàn)在都沒人寫一篇,甚至轉(zhuǎn)載一篇,為了使版面好看點,抽了點時間寫篇技術(shù)含量≈0的Pig安裝配置教程。

Pig是yahoo捐獻給apache的一個工程,它是SQL-like語言,是在MapReduce上構(gòu)建的一種高級查詢語言,把一些運算編譯進MapReduce模型的Map和Reduce中,并且用戶可以定義自己的功能。這是Yahoo開發(fā)的又一個克隆Google的工程:Sawzall。

Pig是一個客戶端應用程序,就算你要在Hadoop集群上運行Pig,也不需要在集群上裝額外的東西。Pig的安裝是灰常的簡單的:

1、安裝JAVA6〔在Windows的話要裝Cygwin〕,設(shè)置好JAVA_HOME。

%e*portJAVA_HOME=/home/tom/jdk1.6

2、到下載一個穩(wěn)定的發(fā)行版〔目前是,可以在Hadoop-0.20.*上運行〕,解壓到你的工作空間:

%tar*zfpig-*.y.z.tar.gz

3、為了方便,可以把Pig的程序目錄放到命令行路徑里,比方:

%e*portPIG_INSTALL=/home/tom/pig-*.y.z

%e*portPATH=$PATH:$PIG_INSTALL/bin

注銷或重啟,你就可以用pig-help來查看使用幫助了,安裝夠簡單吧?:〕

Pig有兩種模式:一種是Localmode,也就是本地模式,這種模式下Pig運行在一個JVM里,訪問的是本地的文件系統(tǒng),只適合于小規(guī)模數(shù)據(jù)集,一般是用來體驗Pig。而且,它并沒有用到Hadoop的Localrunner,Pig把查詢轉(zhuǎn)換為物理的Plan,然后自己去執(zhí)行。在終端下輸入

%pig-*local

就可以進入Local模式了。還有一種就是Hadoop模式了,這種模式下,Pig才真正的把查詢轉(zhuǎn)換為相應的MapReduceJobs,并提交到Hadoop集群去運行,集群可以是真實的分布式也可以是偽分布式。要想Pig能認識Hadoop,你要告訴它Hadoop的版本以及一些關(guān)鍵daemon的信息〔也就是Namenode和Jobtracker的Address和Port〕。比方,下面這個可以允許Pig連接到任何Hadoop0.20.*上:

%e*portPIG_HADOOP_VERSION=20

接下來,你還要指明集群的Namenode和Jobtracker的所在。有兩種方法,一種就是把你Hadoop的Conf地址添加到Pig的Classpath上:

%e*portPIG_CLASSPATH=$HADOOP_INSTALL/conf/

還有一種就是在Pig目錄的Conf文件夾〔可能需要自己創(chuàng)立〕里創(chuàng)立一個perties文件,然后在里面添加集群的Namenode和Jobtracker的信息:

=hdfs://localhost/

mapred.job.tracker=localhost:8021

搞定后,在終端執(zhí)行下面的命令:

%pig

你就會看到下面的信息:

2009-03-2921:22:20,489[main]INFO

org.apache.pig.backend.hadoop.e*ecutionengine.

HE*ecutionEngine–Connectingtohadoopfilesystemat:hdfs://localhost/

2009-03-2921:22:20,760[main]INFO

org.apache.pig.backend.hadoop.e*ecutionengine.

HE*ecutionEngine–Connectingtomap-reducejobtrackerat:localhost:8021

grunt>

如你所見,Pig報告已經(jīng)連上了Hadoop的Namenode和Jobtracker,是不是也灰常的簡單?PIG實戰(zhàn)Pig實戰(zhàn)1.pig簡介2.安裝pig3.實戰(zhàn)pig4.深入pig5.參考資料及代碼下載<1>.Pig簡介pig是hadoop工程的一個拓展工程,用以簡化hadoop編程〔簡化的程度超乎想象啊〕,并且提供一個更高層次抽象的數(shù)據(jù)處理能力,同時能夠保持hadoop的簡單和可靠性。<2>.安裝pig2.1下載pig:[點擊下載]pig安裝包2.2解壓下載完成的pig安裝包:2.3設(shè)置環(huán)境變量*uqiangubuntu:~$vim.bashrce*portPATH=~/hadoop/src/pig/pig-0.8.1/bin/:$PATH這里需要說明的是pig是能夠運行在兩種模式下:local模式和mapreduce模式,變量HADOOP_CONF_DIR主要是為了在mapreduce模式下使用。為了使新設(shè)置的環(huán)境變量生效,使用如下命令:*uqiangubuntu:~$source.bash_profile測試一下pig的安裝是否正確:*uqiangubuntu:~$pig-*local2011-06-0517:48:49,480[main]INFOorg.apache.pig.Main-Loggingerrormessagesto:/home/*uqiang/pig_71.log2011-06-0517:48:49,926[main]INFOorg.apache.pig.backend.hadoop.e*ecutionengine.HE*ecutionEngine-Connectingtohadoopfilesystemat:file:///grunt>此時說明pig已經(jīng)正確安裝。<3>.Pig實戰(zhàn)在pig下載的安裝包,解壓完成了之后,有一個tutorial目錄,我們使用里面的數(shù)據(jù)來開場pig學習。如果tutorial目錄下沒有存在文件的話,則需要使用ant來編譯出這個文件:*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1$ant這時ant將會下載依賴的jar的文件,同時將編譯出對應版本的pigjar文件。然后進入tutorial目錄,執(zhí)行ant命令:*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1$cdtutorial/*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1/tutorial$ant這時將生成文件,解壓該文件形成pigtmp的文件夾。該文件夾構(gòu)造:.|--e*cite-small.log|--pig.jar|--script1-hadoop.pig|--script1-local.pig|--script2-hadoop.pig|--script2-local.pig`--tutorial.jar1directory,9files我們下面將主要分析e*cite-small.log文件,該文件的數(shù)據(jù)構(gòu)造如下:UserIDTimeStampSearchQuery我們首先將e*cite-small.log加載到一個變量〔也稱之為alias〕中,我們將使用該變量來表示這個數(shù)據(jù)集:grunt>log=load'e*cite-small.log'as(user,time,query);注意的是這時pig并沒有運行該命令,僅僅是解析了該命令,只有到使用dump命令或者是store命令時pig才會真正執(zhí)行該命令。dump命令將打印出這個變量的內(nèi)容,store命令將變量所代表的內(nèi)容保存到一個文件中。這時如果想要查看該log的構(gòu)造:grunt>describelog;log:{user:bytearray,time:bytearray,query:bytearray}這是如果我們想要查看該log文件的前4行的話:grunt>lmt=limitlog4;grunt>dumplmt;這時將打印出log文件的前四行數(shù)據(jù)。<4>.深入pig4.1Utilityandfilecommands4.2Dataread/writeoperators4.3Diagnosticoperators診斷操作4.4Datatypeandschemespig中有6個根本數(shù)據(jù)類型和3個復合數(shù)據(jù)類型,根本數(shù)據(jù)類型如下:復合數(shù)據(jù)類型:pig中數(shù)據(jù)模型中能夠允許數(shù)據(jù)類型的嵌套,類似于*ml/json格式。4.5E*pressionandfunctionspig能夠支持常見運算符。同時在pig中提供了一些內(nèi)建函數(shù)。這里我們沒有給出例如,將在下面給出例如。4.6Retionaloperators首先編寫兩個數(shù)據(jù)文件A:0,1,21,3,4數(shù)據(jù)文件B:0,5,21,7,8運行pig:*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1/tutorial/pigtmp$pig-*local2011-06-0518:46:54,324[main]INFOorg.apache.pig.backend.hadoop.e*ecutionengine.HE*ecutionEngine-Connectingtohadoopfilesystemat:file:///grunt>加載數(shù)據(jù)A:grunt>a=load'A'usingPigStorage(',')as(a1:int,a2:int,a3:int);加載數(shù)據(jù)B:grunt>b=load'B'usingPigStorage(',')as(b1:int,b2:int,b3:int);求a,b的并集:grunt>c=uniona,b;grunt>dumpc;(0,5,2)(1,7,8)(0,1,2)(1,3,4)將c分割為d和e,其中d的第一列數(shù)據(jù)值為0,e的第一列的數(shù)據(jù)為1〔$0表示數(shù)據(jù)集的第一列〕:grunt>splitcintodif$0==0,eif$0==1;查看d:grunt>dumpd;(0,1,2)(0,5,2)查看e:(1,3,4)(1,7,8)選擇c中的一局部數(shù)據(jù):grunt>f=filtercby$1>3;查看數(shù)據(jù)f:grunt>dumpf;(0,5,2)(1,7,8)對數(shù)據(jù)進展分組:grunt>g=groupcby$2;查看g:grunt>dumpg;(2,{(0,1,2),(0,5,2)})(4,{(1,3,4)})(8,{(1,7,8)})當然也能夠?qū)⑺械脑丶系揭黄穑篻runt>h=groupcall;grunt>dumph;(all,{(0,1,2),(1,3,4),(0,5,2),(1,7,8)})查看h中元素個數(shù):grunt>i=foreachhgenerateCOUNT($1);查看元素個數(shù):grunt>dumpi;這里可能出現(xiàn)Couldnotresolvecounterusingimported:[,org.apache.pig.builtin.,org.apache.pig.impl.builtin.]的情況,這是需要使用register命令來注冊pig對應的jar版本。接下倆試一下jon操作:grunt>j=joinaby$2,bby$2;該操作類似于sql中的連表查詢,這是的條件是$2==$2。取出c的第二列$1和$1*$2,將這兩列保存在k中:grunt>k=foreachcgenerate$1,$1*$2;查看k的內(nèi)容:grunt>dumpk;(5,10)(7,56)(1,2)(3,12)4.7WorkingwithUDF(userdefinedfunction)pig能夠支持兩種類型的UDFs:eval和load/store,其中l(wèi)oad/store的自定義函數(shù)主要是用來加載和保存特定的數(shù)據(jù)格式;eval自定義函數(shù)主要用來進展常規(guī)的數(shù)據(jù)轉(zhuǎn)換。1.eval如果想要實現(xiàn)自定義的eval類型的函數(shù),則根本的做法是首先編寫一個類繼承自EvalFunc<T>這個抽象類,同時需要重寫這個類的一方法:abstractpublicTe*ec(Tupleinput)throwsIOE*ception;該方法傳入的類型是Tuple類型。如果調(diào)用udf時使用的是:udf(ARG1,ARG2);則調(diào)用input.get(0)將得到ARG1,同理input.get(1)得到的是ARG2,input.getSize()得到傳遞的參數(shù)的數(shù)量,這里就是2.下面我們就開場編寫udfUPPER.java,將UPPER.java文件保存到myudfs目錄下:packagemyudfs;

importjava.io.IOE*ception;

importorg.apache.pig.EvalFunc;

importorg.apache.pig.data.Tuple;

importorg.apache.pig.impl.util.WrappedIOE*ception;

publicclassUPPERe*tendsEvalFunc<String>

{

publicStringe*ec(Tupleinput)throwsIOE*ception{

if(input==null||input.size()==0)

returnnull;

try{

Stringstr=(String)input.get(0);

returnstr.toUpperCase();

}catch(E*ceptione){

throwWrappedIOE*ception.wrap("Caughte*ceptionprocessinginputrow",e);

}

}}編譯該文件,同時生成該jar文件:*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1/myudfs$javac-cp../pig.jarUPPER.java*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1/myudfs$cd..*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1$jar-cfmyudfs.jarmyudfs準備student_data文件:student1,1,1

studetn2,2,2

student3,3,3

student4,4,4在pig中測試該udf:*uqiangubuntu:~/hadoop/src/pig/pig-0.8.1$pig-*local注冊該udf:grunt>registermyudfs.jar加載數(shù)據(jù):grunt>A=load'student_data'usingPigStorage(',')as(name:chararray,age:int,gpa:double);grunt>B=FOREACHAGENERATEmyudfs.UPPER(name);grunt>dumpB;這時將輸出:(STUDENT1)

(STUDETN2)

(STUDENT3)

(STUDENT4)ApachePig的一些根底概念及用法總結(jié)〔1〕Apachepig是用來處理大規(guī)模數(shù)據(jù)的高級查詢語言,配合Hadoop使用,可以在處理海量數(shù)據(jù)時到達事半功倍的效果,比使用Java,C++等語言編寫大規(guī)模數(shù)據(jù)處理程序的難度要小N倍,實現(xiàn)同樣的效果的代碼量也小N倍。Twitter就大量使用pig來處理海量數(shù)據(jù)——有興趣的,可以看Twitter工程師寫的這個PPT。但是,剛接觸pig時,可能會覺得里面的*些概念以及程序?qū)崿F(xiàn)方法與想像中的很不一樣,甚至有些莫名,所以,你需要仔細地研究一下根底概念,這樣在寫pig程序的時候,才不會覺得非常別扭。本文基于以下環(huán)境:先給出兩個鏈接:pig參考手冊1,pig參考手冊2。本文的局部內(nèi)容來自這兩個手冊,但涉及到翻譯的局部,也是我自己翻譯的,因此可能理解與英文有偏差,如果你覺得有疑義,可參考英文內(nèi)容。【配置Pig語法高亮】在正式開場學習Pig之前,你首先要明白,配置好編輯器的Pig語法高亮是很有用的,它可以極大地提高你的工作效率。如果你在Windows下編寫Pig代碼,好似還真沒有什么輕量級的編輯器插件〔例如Notepad++的插件之類的〕可以實現(xiàn)對.pig文件的語法高亮顯示,我建議你使用Notepad++,在"UserDefineLanguage〞中自定義Pig語法高亮方案〔我這樣做之后感覺效果很好〕;如果你覺得麻煩,則你可以直接用Notepad++以SQL的語法高亮來查看Pig代碼,這樣的話可以高亮Pig中的一局部關(guān)鍵字。在Linu*下,選擇就很多了,大分部人使用的是vi,vim,但我是個Emacs控,所以我就先說說如何配置Emacs的Pig語法高亮。此插件是一個很好的選擇:s://github./cloudera/piglatin-mode則,怎么使用這個插件呢?下載piglatin.el文件,將它放置在任何地方——當然,為了方便,最好是放在你登錄用戶的根目錄下〔也就是與.emacs配置文件在同一目錄下〕,然后將其重命名為".piglatin.el〞注意前面是有一個點的,也就是說將這個文件設(shè)置成隱藏文件,否則可能會誤刪了。然后,在.emacs文件中的最后,添加上如下一行:(load-file"/home/abc/.piglatin.el")這里假設(shè)了你的.piglatin.el文件放置的位置是在/home/abc/目錄下,也就是說emacs會加載這個文件,實現(xiàn)語法高亮顯示?,F(xiàn)在,你再翻開一個.pig文件試試看?非常令人賞心悅目的高亮效果就出來了。效果如下列圖所示:其實Emacs也有Windows版的,如果你習慣在Windows下工作,完全可以在Windows下按上面的方法配置一下Pig語法高亮〔但是Windows版的Emacs還需要一些額外的配置工作,例如修改注冊表等,所以會比在Linu*下使用要麻煩一些,具體請看這篇文章〕。文章來源:.codelast./下面開場學習Pig。〔1〕關(guān)系〔relation〕、包〔bag〕、元組〔tuple〕、字段〔field〕、數(shù)據(jù)〔data〕的關(guān)系一個關(guān)系〔relation〕是一個包〔bag〕,更具體地說,是一個外部的包〔outerbag〕。一個包〔bag〕是一個元組〔tuple〕的集合。在pig中表示數(shù)據(jù)時,用大括號{}括起來的東西表示一個包——無論是在教程中的實例演示,還是在pig交互模式下的輸出,都遵循這樣的約定,請牢記這一點,因為不理解的話就會對數(shù)據(jù)構(gòu)造的掌握產(chǎn)生偏差。一個元組〔tuple〕是假設(shè)干字段〔field〕的一個有序集〔orderedset〕。在pig中表示數(shù)據(jù)時,用小括號()括起來的東西表示一個元組。一個字段是一塊數(shù)據(jù)〔data〕。"元組〞這個詞很抽象,你可以把它想像成關(guān)系型數(shù)據(jù)庫表中的一行,它含有一個或多個字段,其中,每一個字段可以是任何數(shù)據(jù)類型,并且可以有或者沒有數(shù)據(jù)。

"關(guān)系〞可以比喻成關(guān)系型數(shù)據(jù)庫的一張表,而上面說了,"元組〞可以比喻成數(shù)據(jù)表中的一行,則這里有人要問了,在關(guān)系型數(shù)據(jù)庫中,同一張表中的每一行都有固定的字段數(shù),pig中的"關(guān)系〞與"元組〞之間,是否也是這樣的情況呢?不是的。"關(guān)系〞并不要求每一個"元組〞都含有一樣數(shù)量的字段,并且也不會要求各"元組〞中在一樣位置處的字段具有一樣的數(shù)據(jù)類型〔太隨意了,是吧?〕文章來源:.codelast./〔2〕一個計算多維度組合下的平均值的實際例子為了幫助大家理解pig的一個根本的數(shù)據(jù)處理流程,我造了一些簡單的數(shù)據(jù)來舉個例子——

假設(shè)有數(shù)據(jù)文件:a.t*t〔各數(shù)值之間是以tab分隔的〕:1234567[rootlocalhostpig]$cata.t*t

a1234.29.8a3053.52.1b799--a7992.66.2a1257.75.9a1231.40.2問題如下:怎樣求出在第2、3、4列的所有組合的情況下,最后兩列的平均值分別是多少?例如,第2、3、4列有一個組合為〔1,2,3〕,即第一行和最后一行數(shù)據(jù)。對這個維度組合來說,最后兩列的平均值分別為:〔4.2+1.4〕/2=2.8

〔9.8+0.2〕/2=5.0

而對于第2、3、4列的其他所有維度組合,都分別只有一行數(shù)據(jù),因此最后兩列的平均值其實就是它們自身。特別地,組合〔7,9,9〕有兩行記錄:第三、四行,但是第三行數(shù)據(jù)的最后兩列沒有值,因此它不應該被用于平均值的計算,也就是說,在計算平均值時,第三行是無效數(shù)據(jù)。所以〔7,9,9〕組合的最后兩列的平均值為2.6和6.2。我們現(xiàn)在用pig來算一下,并且輸出最終的結(jié)果。先進入本地調(diào)試模式〔pig-*local〕,再依次輸入如下pig代碼:1234A=LOAD'a.t*t'AS(col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double);B=GROUPABY(col2,col3,col4);C=FOREACHBGENERATEgroup,AVG(A.col5),AVG(A.col6);DUMPC;pig輸出結(jié)果如下:1234((1,2,3),2.8,5.0)((1,2,5),7.7,5.9)((3,0,5),3.5,2.1)((7,9,9),2.6,6.2)這個結(jié)果對嗎?手工算一下就知道是對的。文章來源:.codelast./下面,我們依次來看看每一句pig代碼分別得到了什么樣的數(shù)據(jù)。①加載a.t*t文件,并指定每一列的數(shù)據(jù)類型分別為chararray〔字符串〕,int,int,int,double,double。同時,我們還給予了每一列別名,分別為col1,col2,……,col6。這個別名在后面的數(shù)據(jù)處理中會用到——如果你不指定別名,則在后面的處理中,就只能使用索引〔$0,$1,……〕來標識相應的列了,這樣可讀性會變差,因此,在列固定的情況下,還是指定別名的好。將數(shù)據(jù)加載之后,保存到變量A中,A的數(shù)據(jù)構(gòu)造如下:1A:{col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double}可見,A是用大括號括起來的東西。根據(jù)本文前面的說法,A是一個包〔bag〕。這個時候,A與你想像中的樣子應該是一致的,也就是與前面打印出來的a.t*t文件的內(nèi)容是一樣的,還是一行一行的類似于"二維表〞的數(shù)據(jù)。文章來源:.codelast./②按照A的第2、3、4列,對A進展分組。pig會找出所有第2、3、4列的組合,并按照升序進展排列,然后將它們與對應的包A整合起來,得到如下的數(shù)據(jù)構(gòu)造:1B:{group:(col2:int,col3:int,col4:int),A:{col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double}}可見,A的第2、3、4列的組合被pig賦予了一個別名:group,這很形象。同時我們也觀察到,B的每一行其實就是由一個group和假設(shè)干個A組成的——注意,是假設(shè)干個A。這里之所以只顯示了一個A,是因為這里表示的是數(shù)據(jù)構(gòu)造,而不表示具體數(shù)據(jù)有多少組。實際的數(shù)據(jù)為:1234((1,2,3),{(a,1,2,3,4.2,9.8),(a,1,2,3,1.4,0.2)})((1,2,5),{(a,1,2,5,7.7,5.9)})((3,0,5),{(a,3,0,5,3.5,2.1)})((7,9,9),{(b,7,9,9,,),(a,7,9,9,2.6,6.2)})可見,與前面所說的一樣,組合〔1,2,3〕對應了兩行數(shù)據(jù),組合〔7,9,9〕也對應了兩行數(shù)據(jù)。這個時候,B的構(gòu)造就不則明朗了,可能與你想像中有一點不一樣了。文章來源:.codelast./③計算每一種組合下的最后兩列的平均值。根據(jù)上面得到的B的數(shù)據(jù),你可以把B想像成一行一行的數(shù)據(jù)〔只不過這些行不是對稱的〕,F(xiàn)OREACH的作用是對B的每一行數(shù)據(jù)進展遍歷,然后進展計算。

GENERATE可以理解為要生成什么樣的數(shù)據(jù),這里的group就是上一步操作中B的第一項數(shù)據(jù)〔即pig為A的第2、3、4列的組合賦予的別名〕,所以它告訴了我們:在數(shù)據(jù)集C的每一行里,第一項就是B中的group——類似于〔1,2,5〕這樣的東西〕。而AVG(A.col5)這樣的計算,則是調(diào)用了pig的一個求平均值的函數(shù)AVG,用于對A的名為col5的列求平均值。前文說了,在加載數(shù)據(jù)到A的時候,我們已經(jīng)給每一列起了個別名,col5就是倒數(shù)第二列。到這里,可能有人要迷糊了:難道AVG(A.col5)不是表示對A的col5這一列求平均值嗎?也就是說,在遍歷B〔FOREACHB〕的每一行時候,計算結(jié)果都是一樣的??!事實上并不是這樣。我們遍歷的是B,我們需要注意到,B的數(shù)據(jù)構(gòu)造中,每一行數(shù)據(jù)里,一個group對應的是假設(shè)干個A,因此,這里的A.col5,指的是B的每一行中的A,而不是包含全部數(shù)據(jù)的那個A。拿B的第一行來舉例:

((1,2,3),{(a,1,2,3,4.2,9.8),(a,1,2,3,1.4,0.2)})

遍歷到B的這一行時,要計算AVG(A.col5),pig會找到

(a,1,2,3,4.2,9.8)中的4.2,以及(a,1,2,3,1.4,0.2)中的1.4,加起來除以2,就得到了平均值。同理,我們也知道了AVG(A.col6)是怎么算出來的。但還有一點要注意的:對(7,9,9)這個組,它對應的數(shù)據(jù)(b,7,9,9,,)里最后兩列是無值的,這是因為我們的數(shù)據(jù)文件對應位置上不是有效數(shù)字,而是兩個"-〞,pig在加載數(shù)據(jù)的時候自動將它置為空了,并且計算平均值的時候,也不會把這一組數(shù)據(jù)考慮在內(nèi)〔相當于忽略這組數(shù)據(jù)的存在〕。到了這里,我們不難理解,為什么C的數(shù)據(jù)構(gòu)造是這樣的了:1C:{group:(col2:int,col3:int,col4:int),double,double}文章來源:.codelast./④DUMPC就是將C中的數(shù)據(jù)輸出到控制臺。如果要輸出到文件,需要使用:1STORECINTO'output';這樣pig就會在當前目錄下新建一個"output〞目錄〔該目錄必須事先不存在〕,并把結(jié)果文件放到該目錄下。請想像一下,如果要實現(xiàn)一樣的功能,用Java或C++寫一個Map-Reduce應用程序需要多少時間?可能僅僅是寫一個build.*ml或者Makefile,所需的時間就是寫這段pig代碼的幾十倍了!正因為pig有如此優(yōu)勢,它才得到了廣泛應用。文章來源:.codelast./〔3〕怎樣統(tǒng)計數(shù)據(jù)行數(shù)在SQL語句中,要統(tǒng)計表中數(shù)據(jù)的行數(shù),很簡單:1SELECTCOUNT(*)FROMtable_nameWHEREcondition在pig中,也有一個COUNT函數(shù),在pig手冊中,對COUNT函數(shù)有這樣的說明:Computesthenumberofelementsinabag.假設(shè)要計算數(shù)據(jù)文件a.t*t的行數(shù):1234567[rootlocalhostpig]$cata.t*t

a1234.29.8a3053.52.1b799--a7992.66.2a1257.75.9a1231.40.2你是否可以這樣做呢:123A=LOAD'a.t*t'AS(col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double);B=COUNT(*);DUMPB;答案是:絕對不行。pig會報錯。pig手冊中寫得很明白:Note:Youcannotusethetupledesignator(*)withCOUNT;thatis,COUNT(*)willnotwork.則,這樣對*一列計數(shù)行不行呢:1B=COUNT(A.col2);答案是:仍然不行。pig會報錯。這就與我們想像中的"正確做法〞有點不一樣了:我為什么不能直接統(tǒng)計一個字段的數(shù)目有多少呢?剛接觸pig的時候,一定非常疑惑這樣明顯"不應該出錯〞的寫法為什么行不通。要統(tǒng)計A中含col2字段的數(shù)據(jù)有多少行,正確的做法是:1234A=LOAD'a.t*t'AS(col1:chararray,col2:int,col3:int,col4:int,col5:double,col6:double

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論