Apache Pig
What is Pig
Apache Pig是MapReduce的一个抽象,它是一个工具/平台(所以说它并不完全是一门语言),用于分析较大数据集,并将其表示为数据流;
Pig通常与Hadoop一起使用,使用Pig进行数据处理、分析时,需要使用其提供的Pig Latin脚本语言编写相应脚本,这些脚本执行时会被转换为Map和Reduce任务(类似Spark),Pig Engine组件接受Pig Latin脚本为输入,并转换为作业;
Why Pig
可以把Pig看作是SQL,相对于java等高级语言来说,它的功能更加简单直接,更容易上手,同时又不像直接写MapReduce程序那样考虑太多分布式相关内容,因此Pig是一种较为适中的用于在分布式集群上进行作业编写的脚本语言;
Component in Pig
Parser:解析Pig脚本,检查其语法以及其他杂项,输出有向无环图DAG,其中运算符为节点,数据流为边;
Optimizer:进行逻辑优化,例如投影和下推;
Compiler:将逻辑计划转为一系列MapReduce作业;
Execution engine:提交MapReduce作业到Hadoop;
DataType in Pig
Atom:任何单个值,无论其数据类型,都认为是原子的;
Tuple:存储一系列字段值,可以是任何类型,类似行;
Bag:一组无序的元组,每个元组中字段数量任意,也就是不需要对齐;
Map:key-value对,key需要是chararray类型且需要唯一;
Relation:一个关系是一个元组的包;
Run with Pig
Grunt Shell:以交互式的方式运行Pig代码,类似python shell;
Script:以脚本方式运行Pig代码,类似python脚本;
UDF:嵌入java等语言使用;
Grunt Shell in Pig
sh:在grunt shell中使用任何shell命令,比如ls;
fs:在grunt shell中使用任何Hadoop命令,比如fs -ls;
command:clear、help、history、set、quit、exec、run、kill;
Pig Latin
DataModel:Relation -> (Tuple,Tuple) -> ((name,age),(name,age,job)) -> ((张三,15),(李四,16,学生))
DataType:int、long、float、double、chararray、Bytearray、Boolean、Datetime、Biginteger、Bigdecimal、Tuple、Bag、Map、Null;
算术运算符:+ - * / % ?:三元运算符 CASE WHEN THEN ELSE多选语句;
比较运算符:== != > < >= <= matches模式匹配;
类型结构运算符:()-Tuple、{}-Bag、[]-Map;
关系运算符:LOAD(将数据从fs加载到关系)、STORE(将数据从fs存储到关系)、FILTER(从关系中删除行)、DISTINCT(从关系中删除重复行)、FOREACH(基于数据列生成数据转换)、GENERATE、STREAM(使用外部程序转换关系)、JOIN(连接两个或多个关系)、COGROUP(将数据分组为两个或多个关系)、GROUP(在单个关系中对数据分组)、CROSS(创建两个或多个关系的向量积)、ORDER(基于一个或多个字段排序关系)、LIMIT(从关系中获取有限个元组)、UNION(将两个或多个关系合并为单个关系)、SPLIT(将单个关系拆分为两个或多个关系)、DUMP(在console上打印关系内容)、DESCRIBE(描述关系模式)、EXPLAIN(查看逻辑、物理或MapReduce执行计划以计算关系)、ILLUSTRATE(查看一系列预测的分步执行);
语句:使用Relation,包括expression和schema,以分号结束,使用运算符执行操作,除LOAD和STORE外,其余语句均采用Relation作为输入,并产生另一个Relation作为输出;
grunt> student_data = LOAD 'student_data.txt' USING PigStorage(',') as (id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray)
Function case with Pig
在交互式过程中,定义的Relation都没有真正的执行,真正执行需要类似DUMP、LOAD、STORE等操作才会触发,类似Spark中的Action算子;
student = LOAD './pig/student.txt' USING PigStorage(',') as (id:int, firstname:chararray, lastname:chararray, phone:chararray,city:chararray);
STORE student INTO './pig/pig_output/' USING PigStorage('\t');
student_filter = FILTER student BY ENDSWITH(firstname,'i')
DUMP student_filter;