歡迎關注大資料和人工智能技術文章釋出的微信公衆号:清研學堂,在這裡你可以學到夜白(作者筆名)精心整理的筆記,讓我們每天進步一點點,讓優秀成為一種習慣!
Pig
一、Pig的介紹:
Pig由Yahoo開發,主要應用于資料分析,Twitter公司大量使用Pig處理海量資料,Pig之是以是資料分析引擎,是因為Pig相當于一個翻譯器,将PigLatin語句翻譯成MapReduce程式(隻有在執行dump和store指令時才會翻譯成MapReduce程式),而PigLatin語句是一種用于處理大規模資料的腳本語言。
二、Pig與Hive的相同與差別:
相同:
1、Hive和Pig都是資料分析引擎,除此之外,還有Spark中的Spark SQL和Cloudera開發的Impala等。
2、Hive和Pig都簡化了MapReduce程式的開發。
不同:
1、Hive作為資料分析引擎有一定限制,隻能分析結構化資料,因為Hive的資料模型是表結構,雖然沒有資料存儲引擎,需要使用者在建立表時指定分隔符(預設以Tab鍵作為分隔符):row format delimited field terminated by ‘,’,而Pig的資料模型是包結構,由tuple和field組成,是以可以分析任意類型的資料。
2、Hive使用的是sql語句分析資料,sql語句是一種聲明式語言,Pig使用的是PigLatin語句分析資料,PigLatin語句是一種過程式語言/腳本語句。
3、Hive中的内置函數不用大寫,Pig中的内置函數必須要大寫。
舉例:按照部門号對員工表分組并求每個部門中薪水的最大值:
sql語句:select deptno,max(sal) from emp group by deptno;
PigLatin語句:emp1 = group emp by deptno;
emp2 = foreach emp1 generate group,MAX(emp.sal)
dump emp2;
(PigLatin語句注意事項:等号前後要有空格)
4、Hive儲存元資訊,是以資料模型不用重建,而Pig不儲存元資訊,是以資料模型需要重建。
5、由于PigLatin語句是腳本語言,是以Hive執行速度比Pig更快。
6、 由于Hive的資料模型是表結構,是以Hive是先建立表,後加載資料,而Pig的資料模型是包結構,Pig在加載資料的同時建立包。
舉例:建立一份員工表
sql語句:
1、建立表:
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int
)row format delimited field terminated by ',';
2、加載HDFS中的資料:
load data inpath '/scott/emp.csv' into table emp;
PigLatin語句:
加載資料的同時建立包:load後加載資料,using後指定分隔符,as後指定包結構
emp=load'/scott/emp.csv'usingPigStorage(',')as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);
三、Hive資料模型和Pig資料模型的差别:
1、Hive的資料模型是表,表由行和列組成,表不可以嵌套,Pig的資料模型是包,包由tuple和field組成,包可以嵌套。
2、表中每一行的列完全相同,包中每一行的列可以不相同,可以動态增加。
四、Pig的安裝和配置:
1、安裝pig:tar -zxvf pig-0.17.0.tar.gz -C ~/traing
2、配置PIG_HOME環境變量:
export PIG_HOME=/root/training/pig-0.17.0
export PATH=$PIG_HOME/bin:$PATH
五、Pig的安裝模式:
1、本地模式:通路本地主機,pig相當于本地的用戶端。
2、叢集模式:通路Hadoop叢集,pig相當于Hadoop的用戶端。
注:1、叢集模式需要配置PIG_CLASSPATH環境變量,用于連接配接到Hadoop上:
export PIG_CLASSPATH=/root/training/hadoop-2.7.3/etc/hadoop
2、啟動pig的叢集模式前,需要先啟動historyserver,因為pig在hadoop上執行任務後需要與historyserver通信,解析執行日志确定任務執行是否成功:
mr-jobhistory-daemon.sh start historyserver
六、Pig的常用指令:操作HDFS
ls、cd、cat、mkdir、pwd、copyFromLocal(上傳)、copyToLocal(下載下傳)、register、define等。
七、操作Pig:
1、指令行:pig提供了一個shell終端與使用者進行互動,使用者可以進行增删改查操作。
啟動pig指令行模式,進入本地模式:pig -x local
啟動pig指令行模式,進入叢集模式:pig - x mapredcue/pig
(pig沒有API可以操作)
八、常用的PigLatin語句:
load:加載資料
foreach:逐行掃描
generate:提取列
filter:過濾
distinct:去重
order by:排序
group by:分組
join:多表查詢
union:聯合查詢
dump:把結果輸出到螢幕上
store:把結果儲存到HDFS上
九、使用PigLatin語句分析資料:
建立員工表:load後加載資料,using後指定分隔符,as後指定包結構
emp = load '/scott/emp.csv' using PigStorage(',') as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);
describe emp;
檢視員工表:2
SQL:select * from emp;
PL:emp0 = foreach emp generate *;
dump emp0;
建立部門表:
dept = load '/scott/dept.csv' using PigStorage(',') as(deptno:int,dname:chararray,loc:chararray);
檢視部門表:
SQL:select * from dept;
PL:dept0 = foreach dept generate *;
dump dept0;
查詢員工号、員工名和薪水:
SQL:select empno,ename,sal from emp;
PL:emp1 = foreach emp generate empno,ename,sal;
dump emp1;
根據薪水對員工表排序:
SQL:select sal from emp order by sal;
PL:emp2 = order emp by sal;
按照部門号對員工表分組并求每個部門中薪水的最大值:
SQL:select deptno,max(sal) from emp group by deptno;
PL:emp3 = group emp by deptno;
emp4 = foreach emp3 generate group,MAX(emp.sal);
dump emp4;
檢視10、20、30号部門的員工
SQL:select * from emp where deptno=10;
select * from emp where deptno=20;
select * from emp where deptno=30;
PL:emp5 = filter emp by deptno==10;
dump emp5;
emp6 = filter emp by deptno==20;
dump emp6;
emp7 = filter emp by deptno==30;
dump emp7;
多表查詢,查詢員工名和部門名:
SQL:select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;
PL:emp8 = join emp by deptno,dept by deptno
emp9 = foreach emp8 generate emp::ename,dept::dname;
dump emp9;
内連接配接:
C = join A by id,B by id;
外連接配接:
左外連接配接:C = join A by id left outer,B by id; #以左側資料為基準,隻傳回左側有的資料
右外連接配接:C = join A by id right outer,B by id;#以右側資料為基準,隻傳回右側有的資料
全外連接配接:C = join A by id full outer, B by id;#兩側資料都傳回
聯合查詢,查詢10号部門和20号部門的員工:
SQL:select * from emp where deptno=10
union
select * from dept where deptno=20;
PL: emp10 = filter emp by deptno==10;
emp11 = filter emp by deptno==20;
emp12 = union emp10,emp11;
實作wordcount;
加載資料
mydata = load '/output/data2.txt' as (line:chararray);
将字元串分割成單詞
words = foreach mydata generate flatten(TOKENIZE(line)) as word;
對單詞分組
grpd = group words by word;
統計每組中單詞數量
cntd = foreach grpd generate group,COUNT(words);
結果顯示到螢幕上
dump cntd;
結果存儲到HDFS上
store cntd into '/pig';
常用的大資料工具
作者:李金澤AlllenLI,清華大學在讀碩士,研究方向:大資料和人工智能