1,Pig 简介
每一个技术的产生都是对实现问题的一种反馈,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级的数据
安装如下:
代码语言:javascript复制/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果报错,可以先下载:文件 brew_install.rb,然后控制台运行ruby brew_install.rb;修改镜像为国内,可以提升下载速度。
代码语言:javascript复制brew install pig
安装完成后:
#进入本地模式,开启处理大文件之旅
pig -x local
3,Pig基础运用
3.1 模拟一个文本数据-student.txt
文件中包含:科目,学生姓名,成绩;我们从处理这个文件中来一起学习pig的入门操作。
2,基本操作
load 数据文件的载入,并用PigStorage来指定列的分隔符,用as 进行模式声明:字段名/类型。
s
代码语言:javascript复制tudent = load '/Users/my_pig/student.txt' using PigStorage(',')
as (subject:chararray, name:chararray, score:int);
# 来查看数据模式
describe student
上面模式输出,我们可以看出类似数据表的结构,student是一个表名,有三字段:subject,name,score;每一个字段都有指定好的类型。方便我们后续的加工处理分析。
简单的操作:过滤,分组,取最大最小值,大家可以不断扩张自己的操作能力。
代码语言:javascript复制filter_subject = FILTER student by subject=='语文';#查看结果集dump filter_subject;
代码语言:javascript复制#分组:通过科目
group_subject = group filter_subject by subject;
#查看结果集-将多行数据-分组后变成一行
dump group_subject;
基于group_subject分组后的数据,我们才可以最聚合计算操作,也就是说数据的模式中需要包含group信息。
代码语言:javascript复制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(',');
3,高级链接操作
典型的内连接(inner join)操作
代码语言:javascript复制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
代码语言:javascript复制outer_student = join student by $0 LEFT OUTER, max_min_score by $0;
#查看结果集
dump outer_student;
还有Cross操作,形成两个数据集的“交叉相乘”,形成数据的笛卡尔积。
代码语言:javascript复制cross_student = CROSS student, max_min_score
还有cogroup, flatten,union,排序等操作。
4,QA与总结
Pig看上去和SQL很相似,但有几点不同:
Pig是一种数据流编程语言,一步一步的操作,上一步的输出可以做为下一步的输入,将问题分成连贯的小步,不断逼近我们想要的数据结果,符合我们人类的工作习惯。而SQL是一种声明式的编程语言,是完整的约束集合,是一起提交运行的。
关系数据库对数据存储有严格的模式定义,比如整型的数据列不能存字符。而Pig对它处理的数据模式要求比较宽松。
Pig 对复杂,多值嵌套的数据结构的支持也不同于只能处理平面数据类型的SQL。但是SQL是支持在线低延迟的查询,Pig主要集中在离线的批数据处理。
结合不同场景,选择二者,我们的工作才能事半功倍。