涉及到的知识点:
- Pig的体系结构
- 安装和配置(本地模式、集群模式)
- Pig的常用命令
- Pig的数据模型 – 表结构(重要)
- 使用PigLatin语句分析数据
- Pig的自定义函数
Pig的体系结构
Pig是一个用来处理大规模数据集的平台,由Yahoo开发,贡献给Apache。它可以简化MapReduce任务的开发,支持PigLatin语句(类似SQL)。其本质是一个翻译器,将PigLatin语句转换为MapReduce任务来执行,并返回。
Pig0.17开始支持转换为Spark任务
下面是Pig的体系结构图:
安装和配置
安装Pig
安装流程如下:
(1)解压安装包
tar -zxvf pig-0.17.0.tar.gz -C ~/training/
(2)设置环境变量 vi ~/.bash_profile
PIG_HOME=/root/training/pig-0.17.0
export PIG_HOMEPATH=$PIG_HOME/bin:$PATH
export PATH
(3)使环境变量生效
source ~/.bash_profile
到这里就安装配置完成,下面我们来看一下它的两种模式。
本地模式
特点:操作的是Linux的文件
启动命令:pig -x local
当日志中出现以下这一句时,说明启动的是本地模式:
日志:Connecting to hadoop file system at: file:///
集群模式
特点:链接到HDFS上
集群模式需要设置一个环境变量( ~/.bash_profile文件): PIG_CLASSPATH —-> Hadoop的配置文件所在的目录(注意这里的名字必须叫:PIG_CLASSPATH )
PIG_CLASSPATH=$HADOOP_HOME/etc/hadoop
export PIG_CLASSPATH
配置完成重新生效配置文件source ~/.bash_profile,然后输入pig命令即可,如果出现如下日志说明集群模式配置成功:
日志: Connecting to hadoop file system at: hdfs://bigdata113:9000
Pig的常用命令
pig的常用命令其实和我们hdfs的差不多,具体如下:
ls、cd、cat、mkdir、pwd
copyFromLocal(上传)、copyToLocal(下载)
sh: 调用操作系统的命令(即linux下的命令)
register、define —–> 部署pig的自定义函数的jar包
我们这里随便的用几个,其它的自己再去研究:
register和define在后面讲到自定义函数时会说明。
Pig的数据模型
Pig的数据模型其实就是表,不过和普通的表结构不同:
PigLatin语句的介绍和使用
在开始介绍说明之前,我们需要启动Yarn的HistoryServer(因为Pig会使用到):
mr-jobhistory-daemon.sh start historyserver
可以通过下列网页地址访问historyserver:
现在开始正式介绍PigLatin。
常见的PigLatin语句
(1)load 加载数据到表(bag)
(2)foreach 相当于循环,对bag中每一个行tuple进行处理
(3)filter 过滤、相当于where
(4)group by 分组
(5)order by 排序
(6)join 链接(相当于多表查询)
(7)generate 提取列(查询指定列)
(8)union、intersect 集合运算
(9)输出:dump 输出到屏幕 –> 只有9会触发计算,其它的都不会
store 输出到文件
注意:
PigLatin语句跟Spark中算子/方法非常像
PigLatin有些会触发计算,有些不会
类似Spark RDD 算子(方法):
Transformation方法(算子) —–> 不会触发计算
Action方法(算子) ——> 会触发Spark的计算
PigLatin语句的使用
(1)创建员工表 emp
emp = load '/scott/emp.csv';
查看表结构:
describe emp;
结果如下:
原因是我们并没有指定表结构,(2)中会使用表结构来创建emp表。
(2)创建表,指定schema(结构)
emp = load ‘/scott/emp.csv’ as(empno,ename,job,mgr,hiredate,sal,comm,deptno);
注意:
- 默认的列的类型:bytearray
默认的分隔符:制表符
基于以上两点,我们创建emp表的最终版如下:
emp = load ‘/scott/emp.csv’ using PigStorage(‘,’) as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);
查询的结果如下:
表结构已经清楚了,我们通过dump emp;
来查看一下数据:
顺便创建一下部门表,后面多表查询的示例会用到:
dept = load ‘/scott/dept.csv’ using PigStorage(‘,’) as(deptno:int,dname:chararray,loc:chararray);
(3)查询员工信