Apache pig概述
pig是MapReduce的一个抽象。它是一个工具,用于分析较大的数据集,并将其表示为数据流。常与Hadoop一起使用,可以使用pig在Hadoop中执行所有的数据处理操作。
pig提供了一种名为pig Latin的高级语言。使用pig分析数据,需要编写pig Latin脚本,这些脚本在内部都转化为MapReduce任务。
pig与MapReduce的区别:
pig与hive的区别
pig Latin 一种并行的数据流语言
用户从一个或多个数据源并行读取数据,然后并行的处理,最后将结果并行的输出到一个或者多个结果集中。pig描述的是一个有向无环图。
pig Latin数据模型
Pig Latin的数据模型是完全嵌套的,它允许复杂的非原子数据类型。
原子(atom):任何单个值,无论其数据类型都是atom。它存储为字符串,可以用作字符串和数字。例:“raja“或“30"
元组(tuple):由有序字段集合形成的记录称为元组,字段可以是任何类型。例:(Raja,30)。tuple的映射操作是用 .(点操作符)。可以通过字段名引用,也可以通过位置引用。t.x,t.$1。
包(bag):一个包是一组无序的元组。换句话说,元组(非唯一)的集合被称为包。每个元组可以有任意数量的字段(灵活模式)。包由“{}"表示。例:{(Raja,30),(Mohammad,45)}。用户需要映射bag字段的时候,可以通过创建一个包含用户需要字段的bag。
映射(map):k-v对。k是chararray类型,v可以是任何类型,由[]表示。例:[name#Raja,age#30]
关系(relation):一个关系是一个元组的包,pig Latin中的关系是无需的。
模式:为数据定义的模式
将用户的数据模式传达给pig最简单的方式就是在加载数据时告诉pig用户加载的数据是什么样子的。当用户生命一个数据模式时,也不一定要声明其中的复杂数据类型,比如声明了一个tuple,但是也可以不申明其中包含了哪些字段。
pig Latin基础
1、 数据模型:关系是pig数据模型最外层的结构。它是一个包,其中:
- 元组的集合
- 元组是有序的字段集合
- 字段是一段数据
2、 语句:语句是基本结构
- 语句使用关系,包括 表达式 和 模式。
- 语句用 ; 结尾。
- pig提供运算符执行各种操作。
- 除了 load 和 store,在其他的各种操作下,pig都用关系作为输入,产生另外一个关系作为输出
- 要查看模式的内容需要使用dump运算符。只有执行了dump后,才会执行将数据加载到MapReduce的作业。
3、 数据类型
int long float double chararray bytearray boolean datetime biginteger bigdecimal
复杂类型:tuple bag map
null值
4、 算数运算符
+ - * / % ? :
case when then else end
5、 比较运算符
== != > < >= <= matches
6、 类型结构运算符
() 元组构造函数运算符
{} 包构造函数运算符
[] 映射构造函数运算符
7、 关系运算符
pig Latin是一种数据流语言,每个处理步骤都会产生一个新的数据集,或者产生一个新的关系。关系名称也就是我们所说的别名。
除了关系名称外,pig Latin还有一个概念就是字段名称,表示一个关系中所包含的列的名称。
pig加载数据
Relation_name = LOAD 'Input file path' USING function as schema;
- relation_name - 我们必须提到要存储数据的关系。
- Input file path - 我们必须提到存储文件的HDFS目录。(在MapReduce模式下)
- function - 我们必须从Apache Pig提供的一组加载函数中选择一个函数( BinStorage,JsonLoader,PigStorage,TextLoader )。
- Schema - 我们必须定义数据的模式,可以定义所需的模式如下 :(column1 : data type, column2 : data type, column3 : data type);
- 注意:我们加载数据而不指定模式。在这种情况下,列将被寻址为$01,$02,等...(检查)。
pig存储数据
STORE Relation_name INTO ' required_directory_path ' [USING function];
pig diagnostic运算符
验证load语句的执行,必须使用diagnostic运算符。
pig Latin提供了四种不同类型的诊断运算符:
- dump
- describe
- explanation
- illustration
Dump 运算符用于运行Pig Latin语句,并在屏幕上显示结果,它通常用于调试目的。
Dump Relation_Name
describe运算符用于查看关系的模式。
Describe Relation_name
执行上述 Pig Latin 语句后,将生成以下输出。
grunt> student: { id: int,firstname: chararray,lastname: chararray,phone: chararray,city: chararray }
explain运算符用于显示关系的逻辑,物理和MapReduce执行计划。
explain Relation_name;
illustrate 运算符为你提供了一系列语句的逐步执行。
illustrate Relation_name;
pig group运算符
GROUP运算符用于在一个或多个关系中对数据进行分组,它收集具有相同key的数据。
Group_data = GROUP Relation_name BY age;
group all 将数据集的所有数据放到一个分组里
按多列分组
让我们按年龄和城市对关系进行分组,如下所示。
grunt> group_multiple = GROUP student_details by (age, city);
Pig Cogroup运算符
COGROUP运算符的运作方式与GROUP运算符相同。两个运算符之间的唯一区别是group运算符通常用于一个关系,而cogroup运算符用于涉及两个或多个关系的语句。
cogroup_data = COGROUP student_details by age, employee_details by age;
Pig Join运算符
JOIN 运算符用于组合来自两个或多个关系的记录。在执行连接操作时,我们从每个关系中声明一个(或一组)元组作为key。 当这些key匹配时,两个特定的元组匹配,否则记录将被丢弃。连接可以是以下类型:
- Self-join
- Inner-join
- Outer-join − left join, right join, and full join
1、 Self-join(自连接)
Self-join 用于将表与其自身连接,就像表是两个关系一样,临时重命名至少一个关系。通常,在Apache Pig中,为了执行self-join,我们将在不同的别名(名称)下多次加载相同的数据。
语法
下面给出使用 JOIN 运算符执行self-join操作的语法。
grunt> Relation3_name = JOIN Relation1_name BY key, Relation2_name BY key ;
2、 Inner Join(内部连接)
Inner Join使用较为频繁;它也被称为等值连接。当两个表中都存在匹配时,内部连接将返回行。基于连接谓词(join-predicate),通过组合两个关系(例如A和B)的列值来创建新关系。查询将A的每一行与B的每一行进行比较,以查找满足连接谓词的所有行对。当连接谓词被满足时,A和B的每个匹配的行对的列值被组合成结果行。
grunt> result = JOIN relation1 BY columnname, relation2 BY columnname;
3、 Outer Join:与inner join不同,outer join返回至少一个关系中的所有行。outer join操作以三种方式执行:
- Left outer join
- Right outer join
- Full outer join
3-1、Left Outer Join(左外连接)
left outer join操作返回左表中的所有行,即使右边的关系中没有匹配项。
Relation3_name = JOIN Relation1_name BY id LEFT OUTER, Relation2_name BY customer_id;
3-2、Right Outer Join(右外连接)
right outer join操作将返回右表中的所有行,即使左表中没有匹配项。
outer_right = JOIN customers BY id RIGHT, orders BY customer_id;
3-3、Full Outer Join(全外连接)
当一个关系中存在匹配时,full outer join操作将返回行。
outer_full = JOIN customers BY id FULL OUTER, orders BY customer_id;
4、 使用多个Key
我们可以使用多个key执行JOIN操作。
Relation3_name = JOIN Relation2_name BY (key1, key2), Relation3_name BY (key1, key2);
Pig Cross运算符
CROSS 运算符计算两个或多个关系的向量积。
Pig Union运算符
Pig Latin的 UNION 运算符用于合并两个关系的内容。
Relation_name3 = UNION Relation_name1, Relation_name2;
Pig Split运算符
SPLIT 运算符用于将关系拆分为两个或多个关系。
SPLIT Relation1_name INTO Relation2_name IF (condition1), Relation2_name (condition2),
Pig Filter运算符
FILTER 运算符用于根据条件从关系中选择所需的元组。
Relation2_name = FILTER Relation1_name BY (condition);
Pig Distinct运算符
DISTINCT 运算符用于从关系中删除冗余(重复)元组。
Relation_name2 = DISTINCT Relatin_name1;
Pig Foreach运算符
FOREACH 运算符用于基于列数据生成指定的数据转换。
Relation_name2 = FOREACH Relatin_name1 GENERATE (required data);
foreach_data = FOREACH student_details GENERATE id,age,city;
Pig Order By运算符
ORDER BY 运算符用于以基于一个或多个字段的排序顺序显示关系的内容。
Relation_name2 = ORDER Relatin_name1 BY (ASC|DESC);
Pig Limit运算符
LIMIT 运算符用于从关系中获取有限数量的元组。
Result = LIMIT Relation_name required number of tuples;
limit_data = LIMIT student_details 4;
Pig Eval函数
Apache Pig Eval函数www.w3cschool.cnApache Pig提供了各种内置函数。
1、 AVG()函数:求包内均值
2、 BagToString()函数:将包的元素连接成字符串
3、 CONCAT()函数:连接两个或多个相同类型的表达式
4、 COUNT()函数:获取包中元素的数量,同时计算包中元组的数量
5、 COUNT_STAR()函数:它类似于COUNT() 函数。它用于获取包中的元素数量。
6、DIFF()函数:比较元组中的两个包(字段)。
7、IsEmpty()函数:检查包或映射是否为空。
8、MAX()函数(MIN同):计算单列包中的列(数值或字符)的最大值。
9、 PluckTuple()函数:可以定义字符串Prefix,并过滤以给定prefix开头的关系中的列。
10、SIZE()函数:基于任何Pig数据类型计算元素的数量。
11、SUBTRACT()函数:两个包相减,它需要两个包作为输入,并返回包含第一个包中不在第二个包中的元组的包。
12、SUM()函数:要获取单列包中某列的数值总和。
13、TOKENIZE()函数:要在单个元组中拆分字符串(其中包含一组字),并返回包含拆分操作的输出的包。
pig 加载和存储函数
Apache Pig 加载和存储函数www.w3cschool.cn1、PigStorage:加载和存储结构化文件
2、 TextLoader:非结构化数据加载到pig中
3、 BinStorage:机器可读模式将数据加载到pig中
4、 Handing Compression:加载和压缩数据
pig 包和元组函数
Apache Pig 包和元组函数www.w3cschool.cn1、 TOBAG:多个表达式转换为包
2、 TOP:关系顶部的N个元组
3、 TOTUPLE:多个表达式转化为元组
4、 TOMAP:k-v转化为Map
pig用户定义函数(UDF)
除了内置函数之外,Apache Pig还为UserDefinedFunction(UDF:用户定义函数)提供广泛的支持。使用这些UDF,可以定义我们自己的函数并使用它们。UDF支持六种编程语言,即Java,Jython,Python,JavaScript,Ruby和Groovy。
Pig 运行脚本
多行注释
我们将用'/*'开始多行注释,以'*/'结束。
/* These are the multi-line comments
In the pig script */
单行注释
我们将用“--"开始单行注释。
--we can write single line comments like this.
pig -f:执行的脚本路径
-p:执行的参数,k-v对
-m:参数文件路径