Pig安装讲解
Pig 简介:
Pig 是 Apache 项目的一个子项目,Pig 提供了一个支持大规模数据分析的平台,Pig 突出的特点就是它的结构经得起大量并行任务的检验,使得它能够处理大规模数据集
Pig 特点:
Pig 可简化 MapReduce 任务的开发
Pig 可以看做 Hadoop 的客户端软件,可以连接到 Hadoop 集群进行数据分析工作
Pig 方便不熟悉 Java 的用户,使用一种较为简便的类似 SQL 的面向数据流的语言 PigLatin 语言进行数据处理
PigLatin 可以进行排序,过滤,求和,分组,关联等常用操作,还可以自定义函数,这是面向数据分析处理的轻量级脚本语言
Pig 可以看做是 PigLatin 到 MapReduce 的映射器
当Pig在MapReduce模式运行时,它将访问一个Hadoop集群和HDFS的安装位置。这时Pig将自动地对这个集群进行分配和回收
Pig 的数据模式: relation(关系), bag(包), tuple(元组), field(字段,列)
relation(关系):具有相同字段(列)的 tuple 称为关系
bag(包):与关系型数据库中的表类似,包含多个 tuple,
tuple(元组):相当于关系型数据库中的行,与关系型数据库不同的是,tuple 不要求每一行具有相同的结构
field(字段,列):与关系型数据库中的列相似,不同的是,field 中可以嵌套表,而关系型 数据库中的列中不可以嵌套表
Pig 的安装和配置:
安装: 解压安装包并添加环境变量即可
tar -zxvf pig-0.17.0.tar.gz -C ~/app
vim ~/.bash_profix
PIG_HOME= PIG_HOME=/app/pig-0.17.0
export PIG_HOME
PATH=$PIG_HOME/bin:$PATH
export PATH
Pig 有两种运行模式:本地模式: 操作 Linux 文件
启动方式: pig -x local
集群模式: 链接到 HDFS
PIG_CLASSPATH=/app/hadoop-2.7.3/etc/hadoop
export PIG_CLASSPATH
启动命令: pig
Pig 操作 Linux 命令:
sh 后面跟linux 命令可以直接对 linux 中的文件进行操作
ls cd cat mkdir pwd 操作 HDFS
copyFromLocal 从linux 系统 copy 文件到 HDFS
copyToLocal 从 HDFS copy 文件到 linux 系统
register define 使用 Pig 自定义函数
PigLatin 语句:
---> 需要使用 Hadoop 的 HistoryServer
mr-jobhistory-daemon.sh start historyserver
地址: http://192.168.10.100:19888/jobhistory
---> 常用的 PigLatin 语句
load 加载数据到 bag (表)
foreach 相当于循环, 对 bag 每一条数据遍历
filter 相当于 where
group by 分组
join 连接
generate 提取列
union/intersect 集合运算
输出:dump 直接打印到屏幕上
· store 输出到 HDFS 上
举例: 7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
加载员工数据到bag(表)
emp = load '/input/table/emp.csv' using PigStorage(',')
as (empno:int, ename:chararray, job:chararray, mgr:int, hiredate:chararray, sal:int, comm:int, deptno:int );
dept = load '/scott/dept.csv' using PigStorage(',') as(deptno:int,dname:chararray,loc:chararray);
查看表结构: describe emp;
查询员工信息:员工号, 姓名, 薪水
SQL语句: select empno, ename, sal from emp ;
PL 语句: emp = foreach emp generate empno, ename, sal;
输出到屏幕上: dump emp;
查询员工信息,按照月薪排序:
SQL 语句:select * from emp order by sal ;
PL 语句:emp = order emp by sal ;
分组:求每个部门工资最高值
SQL语句: select deptno, max(sql) from emp group by deptno ;
PL 语句:需要分两部
1. 分组
emp_group = group emp by deptno ;
2. 求每个部门最大值
max_sal = foreach emp_group generate group, MAX(emp.sal)
查询 10 号部门的员工:
SQL 语句: select * from emp where deptno = 10 ;
PL 语句: deptno_10 = filter emp by deptno==10 ;
多表查询:员工姓名, 部门名称
SQL 语句: select e.ename d.dname from emp e, dept d where e.ename=d.dname;
PL 语句: 分两部实现
1. 将两个表中的两个字段提取出来放入一张表中
newtable = join dept by deptno, emp by ename
2. 遍历提取出来的表,将 员工表的员工姓名, 部门表的部门名称提取出来
table = foreach newtable generate dept:: dname, emp:: ename
集合运算: 关系型数据库 Oracle : 参与集合运算的各个集合必须列数相同且类型一致
查询 10 号 和 20 号部门的员工
SQL 语句: select * from emp where deptno=10
union select * from emp where deptno=20;
PL 语句:emp10 = filter emp by deptno==10;
emp20 = filter dept by deptno==20;
emp10_20 = union emp10, emp20;
使用PL实现WordCount:
① 加载数据
mydata = load '/data/data.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;