詳細解讀大數據分析引擎Pig&PigLatin語句


詳細解讀大數據分析引擎Pig&PigLatin語句

Pig

一、Pig的介紹:

Pig由Yahoo開發,主要應用於數據分析,Twitter公司大量使用Pig處理海量數據,Pig之所以是數據分析引擎,是因為Pig相當於一個翻譯器,將PigLatin語句翻譯成MapReduce程序(只有在執行dump和store命令時才會翻譯成MapReduce程序),而PigLatin語句是一種用於處理大規模數據的腳本語言。

詳細解讀大數據分析引擎Pig&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;

dump emp2;

按照部門號對員工表分組並求每個部門中薪水的最大值:

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';

詳細解讀大數據分析引擎Pig&PigLatin語句

常用的大數據工具

作者:李金澤AlllenLI,清華大學碩士研究生,研究方向:大數據和人工智能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM