猪
一、Pig的介绍:
Pig由雅虎开发,主要用于数据分析。Twitter公司用Pig处理海量数据。Pig是数据分析引擎,因为它相当于一个翻译器,把PigLatin语句翻译成MapReduce程序(只有在执行dump和store命令时),Pig Latin语句是一种用来处理大规模数据的脚本语言。
二、Pig与Hive的相同与区别:
相同:
1.Hive和Pig都是数据分析引擎。除此之外,还有Cloudera开发的Spark和Impala中的Spark SQL。
2.Hive和Pig都简化了MapReduce程序的开发。
不同:
1.Hive作为数据分析引擎有一定的局限性,只能分析结构化数据,因为Hive的数据模型是表结构。虽然没有数据存储引擎,但是需要用户在创建表格时指定分隔符(默认为tab键):以','结尾的行格式分隔字段,而Pig的数据模型是包结构,由元组和字段组成,因此可以分析任何类型的数据。
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生成组,MAX(EMP . sal)
转储emp2
(PigLatin语句注意事项:等号前后要有空格)
4.Hive保存元信息,所以不需要重建数据模型,而Pig不保存元信息,所以需要重建数据模型。
5.Hive执行速度比Pig快,因为PigLatin语句是一种脚本语言。
6.由于Hive的数据模型是表结构,Hive先创建表再加载数据,而Pig的数据模型是包结构,Pig在加载数据的同时创建包。
示例:创建一个雇员表。
Sql语句:
1.创建表格:
创建表emp(
empno int,
命名字符串,
作业字符串,
经理int,
租用日期字符串,
sal int,
comm int,
所属部门的编号
)行格式分隔的字段以“,”结尾。
2.在HDFS加载数据:
将路径“/scott/emp.csv”中的数据加载到表emp中;
PigLatin语句:
加载数据时创建包:加载后加载数据,使用后指定分隔符,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的数据模型是一个包,包由元组和字段组成,包可以嵌套。
2.表中每一行的列完全相同,包中每一行的列可以不同,可以动态增加。
四、Pig的安装和配置:
1.安装pig:tar-zxvf pig-0 . 17 . 0 . tar . gz-c ~/training
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';
常用的大数据工具
作者:李金泽AlllenLI,清华大学在读硕士,研究方向:大数据和人工智能