![1a1e630ed0130349eff6e146170598dd.png](https://i-blog.csdnimg.cn/blog_migrate/5b23d6d7552bf9e7510938ce914acc52.jpeg)
1,PIG 简介
每一个技术的产生都是对实现问题的一种反馈:人与人的互联,物与物的互通,人与物的交互的言行动作都产生了很多数据,这些数据对于企业却是弥足珍贵的,在物质充裕的时代,数据信息才是石油。
于是Hadoop大数据生态出现了,基于MapReduce的核心思想构建集群来处理大数据。Pig做为生态的一部分出现在我们的眼前:它在MapReduce的基础上创建了更简单的过程语言抽象,为Hadoop应用程序提供了一种更加接近结构化查询语言(SQL)的接口。
PIG的本地模式能方便的让我们处理本地的大文本文件,比如上百万行的数据Excel有心无力,pig可以;复杂的多值嵌套的数据Excel很费劲,pig很轻松。不需要去用Java去写复杂的Map Reduce代码,pig轻松的语言化处理过程。
pig:经典思路是一大拆多小,一层变多层,让文本数据模式化,处理起来更高效,几行程序可以出上TB的数据。
2,PIG在MAC上的安装
PIG包含两部分:1,用于描述数据流的语言,称为Pig Latin;2,用于Pig Latin程序执行的环境。(单JVM的本地坏境和Hadoop集群上的分布式环境)。
pig内部的一系列操作与变换都被转换成一系列的Map Reduce,是探索大规模数据集的脚步语言,五六行代码就可以处理TB级的数据
运行方式:脚本/GRUNT/嵌入
安装如下:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果报错,可以先下载:文件 brew_install.rb,然后控制台运行ruby brew_install.rb;修改镜像为国内,可以提升下载速度。
brew install pig
安装完成后:
#进入本地模式,开启处理大文件之旅
pig -x local
3,pig基础运用
3.1 模拟一个文本数据-student.txt
文件中包含:科目,学生姓名,成绩;我们从处理这个文件中来一起学习pig的入门操作。
![7118ddba1bf7f1956eb61e47396b9863.png](https://i-blog.csdnimg.cn/blog_migrate/551406e086b34a5ae3c9a8bc0c9131a0.jpeg)
2,基本操作
load 数据文件的载入,并用PigStorage来指定列的分隔符,用as 进行模式声明:字段名/类型。
student = load '/Users/my_pig/student.txt' using PigStorage(',')
as (subject:chararray, name:chararray, score:int);
# 来查看数据模式
describe student
![e0bc932bdc11a1baf2007482c9caa38d.png](https://i-blog.csdnimg.cn/blog_migrate/716d586503c4dbab0ac88a0d05451284.png)
上面模式输出,我们可以看出类似数据表的结构,student是一个表名,有三字段:subject,name,score;每一个字段都有指定好的类型。方便我们后续的加工处理分析。
简单的操作:过滤,分组,取最大最小值,大家可以不断扩张自己的操作能力。
filter_subject = FILTER student by subject=='语文';
#查看结果集
dump filter_subject;
![7045f094c2bb31674b4d42d2888cd925.png](https://i-blog.csdnimg.cn/blog_migrate/04b745ef62b6909c5ca8b60fc55805d8.png)
#分组:通过科目
group_subject = group filter_subject by subject;
#查看结果集-将多行数据-分组后变成一行
dump group_subject;
![7b5635539ceb363f50a8e77bfd9e694d.png](https://i-blog.csdnimg.cn/blog_migrate/fdd0b907efe44600a8d4b44eb6610789.png)
基于group_subject分组后的数据,我们才可以最聚合计算操作,也就是说数据的模式中需要包含group信息。
max_min_score = foreach group_subject generate group, MAX(filter_subject.score), MIN(filter_subject.score);
#查看结果集
dump max_min_score
#保存结果成为一个文件
store max_min_score into 'yuwen_score' using PigStorage(',');
![f90c762f2dfe63b9ef41a86600c831ae.png](https://i-blog.csdnimg.cn/blog_migrate/248e736542c674efcf7d17ab017c8958.png)
3,高级链接操作
典型的内连接(inner join)操作
inner_student = join student by $0, max_min_score by $0;
#查看结果集
dump inner_student;
--
(语文,小7白,122,语文,122,120)
(语文,小6白,120,语文,122,120)
(语文,小4白,120,语文,122,120)
(语文,小3白,120,语文,122,120)
(语文,小白,120,语文,122,120)
(语文,小一白,120,语文,122,120)
(语文,小2白,120,语文,122,120)
外连接(outer join)的操作,可以指定 LEFT OUTER或者 OUTER
outer_student = join student by $0 LEFT OUTER, max_min_score by $0;
#查看结果集
dump outer_student;
![fe99669950b80308584487d4e25f75b2.png](https://i-blog.csdnimg.cn/blog_migrate/6ffc354c90ad0602b0a0363a5b8f6282.jpeg)
还有Cross操作,形成两个数据集的“交叉相乘”,形成数据的笛卡尔积。
cross_student = CROSS student, max_min_score
还有cogroup, flatten,union,排序等操作。
4,QA与总结
Pig看上去和SQL很相似,但有几点不同:
Pig是一种数据流编程语言,一步一步的操作,上一步的输出可以做为下一步的输入,将问题分成连贯的小步,不断逼近我们想要的数据结果,符合我们人类的工作习惯。而SQL是一种声明式的编程语言,是完整的约束集合,是一起提交运行的。
关系数据库对数据存储有严格的模式定义,不如整型的数据列不能存字符。而Pig对它处理的数据模式要求比较宽松。
pig 对复杂,多值嵌套的数据结构的支持也不同于只能处理平面数据类型的SQL。但是SQL是支持在线低延迟的查询,pig主要集中在离线的批数据处理。
结合不同场景,选择二者,我们的工作才能事半功倍。