Weiguo's Station

  • 博客首页

  • 文章归档

  • 分类专栏

  • 各种标签

  • 站点搜索

pig基础

发表于 2019-02-14 更新于 2021-03-22 分类于 大数据

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
2
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/use/bin/python
# -*- coding:utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def outputSchema(schema_def):
def decorate(func):
func.outputSchema = schema_def
return func
return decorate

@outputSchema('newDate:chararray')
def dateChangeFormat(thisDate):
try:
return thisDate.strip().split()[0];
except:
return '2000-01-01'

题外话:现在Spark是主流,建议转Spark

Pig的一些实例

  • 差集的计算
1
2
3
4
5
A = load 'input1' as (x, y);
B = load 'input2' as (u, v);
C = cogroup A by x, B by u;
D = filter C by IsEmpty(B);
E = foreach D generate flatten(A);

解释: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
2
3
4
A = LOAD '1.txt' USING PigStorage (' ‘) AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double); 
B = GROUP A all;
C = FOREACH B GENERATE COUNT(col2);
DUMP C;
  • 加载多个文件
1
2
LOAD '/data/201{8,9}'
load/data/2018 /data/2019两个目录下的数据
  • 其他常用的实例

参考pig实战 pig常用语法总结,教你快速入门——算法篇

# 语言基础
hexo博客同步管理及迁移
Spark基础
  • 文章目录
  • 站点概览
WeiguoZHAO

WeiguoZHAO

Welcome to my blog~
87 日志
13 分类
49 标签
GitHub E-Mail
大牛们
  • colah's blog
  • 王喆的Github
  • 刘建平的Github
  • 美团技术团队
  1. Pig基础知识
  2. Pig运算符
    1. 加载数据
    2. 存储数据
    3. Dump运算符
    4. Describe运算符
    5. Explain运算符
    6. Illustrate运算符
    7. 分组和连接
    8. 合并和拆分
    9. 过滤
    10. 排序
    11. 其他
      1. 内置函数
  3. Pig的一些实例
© 2021 WeiguoZHAO
0%