Pig学习教程
Pig學習
1、Pig Latin簡介
Pig是用來處理大規模數據的高級查詢語言,結合Hadoop使用,可以在處理海量數據時達到事半功倍的效果。
Pig語句通常按照如下的格式來編寫:
-
?通過LOAD語句從文件系統讀取數據。
-
?通過一系列“關系轉換”語句對數據進行處理。
-
?通過STORE語句把處理結果輸出到文件系統中,或使用DUMP語句把處理結果輸出到屏幕上。
Pig有兩種運行模式:Local模式和MapReduce模式。
Pig Latin是一種面向數據流的編程語言,一條語句就是一個操作,得到一個關系,一個Pig Latin程序由一組語句構成。
Pig Latin中常用命令有LOAD, STORE, FILTER, FOREACH,GROUP, ORDER, SPLIT, JOIN等。
常用交互命令
2、Pig數據類型
Pig擁有豐富的數據類型,主要可以分為兩大類:基本類型和復雜類型。
針對復雜數據類型舉例說明如下。
-
元組:字段或屬性值的集合。例如:
(OH, Mark, Twain,31225) -
包:元組的無序集合,大括號內元組之間用逗號分隔。例如:
{ (OH,Mark,Twain,31225), (UK,Charles,Dickens,42207), (ME,Robert,Frost,11496) } -
映射:鍵值對的集合,中括號內,鍵與值之間以#分隔(#是系統默認,不可更改),鍵值對之間用逗號分隔。例如:
3、Pig與Hive比較
Pig與Hive基于其特性對比
-
語言:兩者都有對應的操作語言,編寫的程序最后都轉換為MapReduce程序運行。
-
表概念:Hive中有一個“表”的概念,但Pig中沒有表的概念。
-
遠程服務:Hive可以依托于Thrift啟動一個遠程服務,提供遠程調用;Pig中沒有這樣的功能。
-
自定義函數:兩者都提供UDF,可根據用戶需求來自定義函數。
-
Shell命令行:都有其對應的Shell命令行,而且Pig可以直接執行ls、cat這樣的命令,但Hive不支持這樣使用。
-
Web訪問接口:Hive支持通過瀏覽器訪問,可以在Web頁面中編寫HiveQL語句;Pig不支持Web訪問。
-
JDBC/ODBC:Hive可以通過JDBC/ODBC遠程訪問Hive,遠程需要啟動HiveServer2服務;Pig不支持遠程調用。
Pig Latin是面向數據流的編程語言,而HiveQL是一種描述型編程語言,二者最大的區別在于對作業執行方式的控制粒度不同。
同樣一個任務,HiveQL只需定義要執行的操作即可,HiveQL查詢規劃器會負責安排HiveQL命令的執行順序等。而Pig Latin類似于直接在查詢規劃器這一層操作數據,因此需要用戶自己一步一步地根據數據流的處理方式來編程,即用戶要設計數據流的每一個步驟。
Hive和Pig的選用最終取決于用戶需求,如果用戶更希望使用熟悉的SQL接口操作數據,很明顯應當選用Hive。但如果有專門人員以數據流水線的方式考慮問題,并需要對作業運行方式進行更細粒度的控制,那么Pig可能會是一個更好的選擇。
4、Pig的運行模式
有本地模式(Local模式)和MapReduce模式,每種運行模式都有3種運行方式,分別為:Grunt Shell方式、腳本文件方式、嵌入式程序方式。下面將對運行模式及方式進行介紹。
4.1.本地模式
本地運行模式下,Pig運行在單個JVM中,訪問本地文件系統,該模式用于測試或處理小規模數據集。
(1)Grunt Shell方式Grunt Shell和Windows中的DOS窗口非常類似,在這里用戶可以一條一條地輸入命令對數據進行操作,啟動命令如下所示。
pig -x local(2)腳本文件方式使用腳本文件作為批處理作業來運行Pig命令,它實際上是第一種運行方式中命令的集合,使用如下命令可以運行Pig腳本。
pig -x local script.pig其中,script.pig是對應的Pig腳本,用戶在這里需要正確指定Pig腳本的位置,否則,系統將不能識別。例如,Pig腳本放在“/root/pig”目錄下,那么這里就要寫成“/root/pig/script.pig”。
(3)嵌入式程序方式比如把Pig命令嵌入Java語言中,通過運行這個嵌入式程序來執行Pig命令。首先需要編寫特定的Java程序(主要用到PigServer類),并且將其編譯生成對應的class文件或package包,然后再調用main函數運行程序。關于嵌入式程序方式,本書不做過多介紹,讀者可自行搜索相關資料。
4.2.MapReduce模式
在MapReduce運行模式下,Pig訪問HDFS,并將查詢翻譯為MapReduce任務提交到Hadoop集群中進行處理。
(1)Grunt Shell方式
與本地模式中腳本文件方式類似,區別在于執行命令不同,MapReduce模式下的執行命令如下所示。
pig或pig -x mapreduce(2)腳本文件方式與本地模式中腳本文件方式類似,區別在于執行命令不同,MapReduce模式下的執行命令如下所示。
pig script.pig或pig -x mapreduce script.pig其中,script.pig是對應的Pig腳本,用戶在這里也需要正確指定Pig腳本的位置,否則,系統將不能識別。
(3)嵌入式程序方式與本地模式下的嵌入式程序方式類似,區別在于MapReduce模式下操作的是HDFS中的數據,任務的執行是在Hadoop集群之上。
5 、常用Pig Latin操作
Pig命令可以分為兩大類:數據加載存儲和數據轉換。數據加載使用LOAD命令,加載數據可從本地或HDFS。存儲使用STORE命令,數據可存儲到本地或HDFS,STORE命令可觸發編譯器,將查詢的邏輯計劃編譯為物理計劃,DUMP命令也有此功能。
(1)LODA導入數據
D=LOAD 'mydata_d.txt' AS( id: chararray, name: chararray, age: int, salary: double, states: bag {t: tuple(state1: chararray, state2: chararray)} ); #DUMP語句的作用是輸出關系到控制臺 DUMP A;(2)數據存儲命令:STORE
#使用USING PigStorage(', ')指定存儲的數據分隔符為逗號。 STORE C INTO 'C'USING PigStorage(','); #使用USING JsonStorage()指定存儲的數據為json類型,例如這數據id:1,name:Tom,age:21,salary:2000 STORE C INTO 'C'USING JsonStorage();6、Pig參數替換
#以下myscript.pig腳本 E=LOAD '$input' USING PigStorage(',') As (id: chararray,n ame: chararray, age: int, salary: double); SET job.name ' test_script'; STORE E INTO' $output' USING PigStorage'\t');LOAD加載數據input到關系E,SETjob.name命令設置任務名稱為testscript,STORE命令存儲關系E到input到關系E, SET job.name命令設置任務名稱為test_script,STORE命令存儲關系E到input到關系E,SETjob.name命令設置任務名稱為tests?cript,STORE命令存儲關系E到output目錄。其中input、input、input、output是變量,分別對應輸入數據和存儲目錄,需要在執行腳本時為變量賦值。執行myscript.pig腳本有如下兩種方式:
1)使用-p參數為腳本中變量賦值。
pig-x local -p input=mydata_c.txt-p output=script_out myscript.pig其中,輸入數據使用pig/data/mydata_c.txt,輸出目錄為script_out。
2)使用-param_file參數指定參數文件myscript.params。
pig-param_file myscript.params myscript.pig其中myscript.params文件內容如下所示:
input=mydata_c.txt output=script_out7、數據轉換
7.1、分組命令GROUP
GROUP 關系名 BY(字段1,字段2,···) GROUP 關系名 ALL;7.2、過濾命令FILTER
filter 關系名 BY 表達式 #l例如以下寫法 FA=FILTER salaries BY salary >=10000.0; FB=FILTER salaries BY gender=='F' AND age 〉=50; FC=FILTER salaries BY NOT gender MATCHES 'F';7.3、帥選命令LIMIT
#LIMIT語法如下: LIMIT 關系名 數值 #例如,基于代碼清單5-1創建的關系salaries,使用LIMIT命令創建關系,命令如下: salaries limit=LIMIT salaries 3;7.4、去重命令DISTINCT
#DISTINCT語法如下: DISTINCT 關系名; #例如,基于代碼清單5-1創建的關系salaries,使用LIMIT命令創建關系,命令如下: unique_salaries=DISTINCT salaries;7.5、排序命令ORDER BY
#ORDER BY語法如下: ORDER 關系名 BY 表達式 #例如,基于代碼清單5-1創建的關系salaries,使用ORDER BY命令創建關系,命令如下所示: orderbyage=ORDER salaries BY age ASC;orderbyage_salary=ORDER salaries BY age ASC,salary DESC;7.6、遍歷命令FOREACH
#FOREACH語法如下: FOREACH 關系名 GENERATE 表達式 A=FOREACH salaries GENERATE gender, age, salary; A1=FOREACH salaries GENERATE.. salary; B=FOREACH salaries GENERATE age.. zip; B1=FOREACH salaries GENERATE age..; C=FOREACH salaries GENERATE salary, salary * 0.07 AS bonus; salariesbygender=GROUP salaries BY gender; group_count=FOREACH salariesbygender GENERATE group, COUNT(salarie s) AS salaries count;7.7、嵌套FOREACH
#嵌套FOREACH語法如下: *FOREACH關系名{ 關系名1 = 命令表達式; 關系名2 = 命令表達式; GENERATE表達式; }; #嵌套FOREACH一般配合分組使用,其中中為子句,子句一般是對組進行的操作。 gender_grp=GROUP salaries BY gender; unique_ages=FOREACH gender_grp{ ages=gender_grp. age; unique_age=DISTINCT ages; GENERATE group, COUNT(unique_age);7.8、分支命令CASE
#CASE語法如下: FOREACH 關系名 GENERATE 字段名, (CASE WHEN 表達式1 THEN 表達式或字段名WHEN 表達式1 THEN 表達式或字段名 END)AS字段名;#例子 bonuses=FOREACH salaries GENERATE salary,( CASE WHEN salary 〉=70000.00 THEN salary *0.10 WHEN salary<70000.00 AND salary 〉=30000.0 THEN salary * 0.05 WHEN salary〈=30000.0 THEN 0.0 END) AS bonus;7.9、扁平命令FLATTEN
#FLATTEN語法如下: FLATTEN(關系名)7.10、連接命令JOIN
##(1)內連接 #語法如下: 關系3=J0IN 關系1 BY key1,關系2BY key2; #(2)外連接 #外連接包括全連接、左連接、右連接3種連接方式。 #外連接語法如下: 關系3=J0IN 關系1 BY key1 [FULL|LEFT|RIGHT] OUTER,關系2 BY key2; #例子 outerjoin=JOIN loc BY firstname FULL OUTER,dep BY firstname; leftjoin=JOIN loc BY firstname LEFT OUTER,dep BY firstname; rightjoin=JOIN loc BY firstname RIGHT OUTER,dep BY firstname;總結
- 上一篇: 榆熙教育有限公司:拼多多商家应该了解的常
- 下一篇: 2022新前端面试题(中高级)