pig基础
Pig基础知识
数据模型
- 包(bag)是元组(tuple)的集合
- 元组(tuple)是有序的字段(field)集
- 字段(field)是一段数据
语句
- 每个语句以分号(;)结尾
- 只有illustrate、dump、store等操作的时候,才会执行MapReduce
注释
- 单行注释
--
- 多行注释
/* code */
- 单行注释
数据类型
- int
- long
- float
- double
- chararray
- Bytearray
- Boolean
- Datetime
- Biginteger
- Bigdecimal
- Tuple
- Bag
- Map
- NULL值(上述类型都可以为NULL值,等同与Python中的None)
Pig运算符
加载数据
1 | relation = load 'data_path' using PigStorage() as (name:chararray, gpa:double); |
其中的PigStorage()
为加载或存储结构化数据是使用,还有一些其他的函数参考这里,as 后面跟的是数据的模式,样例中假设了数据模式为name,gpa
,并需要指定每个字段的类型。
读取hive表时使用org.apache.hive.hcatalog.pig.HCatLoader()
,不需要指定模式。
存储数据
1 | store relation into 'data_path' [ using PigStorage() ]; |
同加载数据时类似,这里不需要再指定数据的模式了。
Dump运算符
1 | dump relation; |
用于将关系数据输出到终端中,通常用于调试。调用该命令可以执行MapReduce。
Describe运算符
1 | describe relation; |
输出relation的模型,调用该命令不会执行MapReduce。
Explain运算符
1 | explain relation; |
显示relation的逻辑,物理结构以及MapReduce执行计划。调用该命令不会执行MapReduce。
Illustrate运算符
1 | illustrate relation; |
提供了一系列语句的逐步执行。调用该命令会执行MapReduce。
分组和连接
1 | Group_data = GROUP Relation_name BY age; |
通常是一个关系自我进行分组,可以指定一个、多个或者ALL来分组(当指定为ALL的时候,不需要使用BY)
1 | Cogroup_data = COGROUP Relation1 by age, Relation2 by age; |
和group具有相同的功能,区别是cogroup通常用于多个关系进行分组。
1 | Join_data = Join customers by id, orders by customer_id; |
Join操作和SQL的Join基本一致,也分self-join, left-join, right-join, full-outer-join
合并和拆分
1 | Union_data = UNION relation1, relation2; |
将多个关系上下罗列,注意关系只见的模式(schema)要相同。
1 | SPLIT relation1 into relation2 if (condition), relation3 (condition2); |
过滤
1 | Relation2_name = FILTER Relation1_name BY (condition); |
1 | Relation_name2 = DISTINCT Relatin_name1; |
去重,通常会花费比较多的时间
1 | Relation_name2 = FOREACH Relatin_name1 GENERATE (required data); |
通常用完filter、group、join等操作后,紧接着使用foreach
排序
1 | Relation_name2 = ORDER Relatin_name1 BY (ASC|DESC); |
1 | Result = LIMIT Relation_name (required number of tuples); |
限制记录的数量
其他
内置函数
eval函数
- AVG() 计算包内数值的平均值
- BagToString() 将包的元素连接成字符串
- CONCAT() 连接两个或多个相同类型的表达式
- COUNT() 获取包中元素的数量,同时计算包中元组的数量
- COUNT_STAR() 计算包中的元素数量
- DIFF() 比较元组中的两个包(字段)
- isEmpty() 检查包或映射是否为空
- MAX() 计算单列包中的列(数值或字符)的最大值
- MIN() 计算单列包中的列(数值或字符)的最小值
- PluckTuple() 可定义Prefix,并过滤以给定Prefix开头的关系中的列
- SIZE() 基于任何Pig数据类型计算元素的数量
- SUBtTRACT(A,B) 两个包的差,结果为在A不在B种的元组的包
- SUM() 计算单列包中的某列的数值总和
- TOKENIZE() 要在单个元组中拆分字符串(其中包含一组字),病返回包含拆分操作的输出的包
load函数 / store函数
- PigStorage() 加载和存储结构化文件
- TextLoader() 将非结构化数据加载到Pig中
- BinStorage() 使用机器可读格式将数据加载并存储到Pig中
- Handling Compression 加载和存储压缩数据
bag函数 / tuple函数
- TOBAG() 将两个或多个表达式转换为包
- TOP() 获取关系的顶部N个元组
- TOTUPLE() 将一个或多个表达式转换为元祖
- TOMAP() 将key-value对转换为Map
stirng函数
- date函数
math函数
注释
- / multi-lines code /
- -- single line code
具体使用方法及其他的一些内置函数,常用函数,可以参考w3cschool
写Pig脚本,重点是UDF的编写,这里我写的jython_UDF比较多(其实就是按照Python写的), 需要注意的是要定义好outputSchema,并在UDF函数头部加上修饰符@
1 | #!/use/bin/python |
题外话:现在Spark是主流,建议转Spark
Pig的一些实例
- 差集的计算
1 | A = load 'input1' as (x, y); |
解释:A和B分组后,如果B中为空,那么说明与之对应的A元素仅在A中出现,即在A不在B,也即为A-B的差集
- 传递参数
1 | pig -param date='2014-05-17' example.pig |
pig脚本中用$date
调用该值
- FLATTEN关键字
可以消除嵌套
- 项目相关
1 | %default PDAY '2019-02-02' |
在脚本前面使用该命令设定脚本传递参数的默认值
1 | register xxx.jar as xxx |
在脚本的最前面注册使用jar文件,其中as重命名不是必要的
- 统计行数
1 | A = LOAD '1.txt' USING PigStorage (' ‘) AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double); |
- 加载多个文件
1 | LOAD '/data/201{8,9}' |
- 其他常用的实例