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;
posted @ 2021-01-19 14:06  HoLoong  阅读(194)  评论(0编辑  收藏  举报