结构
一个Pig Latin程序由一组语句构成,一个语句可以理解为一个操作,或一个命令。语句必须以分号结束。
Pig Latin有两种注释方法,双减号表示单行注释。多行注释可以使用/* 和 */表示。
语句
在Pig Latin程序执行时,每个命令按次序进行解析。如果遇到句法或语义错误,解释器会终止运行,并显示错误消息。解释器会给每个关系操作建立一个逻辑计划。逻辑计划是Pig Latin程序的核心。在逻辑计划构造完成前,Pig并不会处理数据。
Pig Latin关系操作
类型 | 操作 | 描述 |
---|---|---|
加载与存储 | LOAD STORE DUMP | 将数据从文件系统或其他存储中加载数据,存入关系 将一个关系放到文件系统或其他存储中 将关系打印到控制台 |
过滤 | FILTER DISTINCT FOREACH…GENERATE STREAM SAMPLE | 从关系中删除不需要的行 从关系中删除重复的行 从关系中增加或删除字段 使用外部程序对关系进行变换 从关系中随机取样 |
分组与连接 | JOIN COGROUP GROUP CROSS | 连接两个或多个关系 在两个或更多关系中对数据进行分组 在一个关系中对数据进行分组 获取两个或更多关系的乘积 |
排序 | ORDER LIMIT | 根据一个或多个字段对某个关系进行排序 将关系的元组个数限定在一定数量内 |
合并与分割 | UNION SPLIT | 合并两个或多个关系 把某个关系切分两个或多个关系 |
Pig Latin的诊断操作
操作 | 描述 |
---|---|
DESCRIBE | 打印关系的模式 |
EXPLAIN | 打印逻辑和物理计划 |
ILLUSTRATE | 使用生成的输入子集逻辑计划的试运行结果 |
Pig Latin UDF语句
语句 | 描述 |
---|---|
REGISTER | 在Pig运行时环境中注册一个JAR文件 |
DEFINE | 为UDF,流式脚本或命令规范新建别名 |
表达式
Pig Latin表达式
类型 | 表达式 | 描述 | 示例 |
---|---|---|---|
常数 | 文字 | 常量值 | 1.0,’a’ |
字段(通过位置指定) | $n | 第n个字段(以0为基数) | $0 |
字段(通过名字指定) | f | 字段名f | year |
投影 | c.$n,c.f | 在容器c(关系、包或元组)中的字段 | records.$0,records.year |
Map查找 | m#k | 在映射m中键k所对应的值 | items’Coat’ |
类型转换 | (t)f | 将字段f转换为类型t | (int)year |
算术 | x+y,x-y x*y,x/y x%y +x,-x | 加法和减法 乘法和除法 取模运算,即x除以y后的余数 正和负 | $1 + $2,$1 - $2 $2 * $2,$2 / $2 $2 % $2 +1,-1 |
条件 | x?y:z | 二值条件三元运算符,如果x为真,则y,否则为z | quantity == 0?0:1 |
比较 | x==y,x!=y x > y,x < y x>=y,x<=y x matches y x is null x is not null | 相等和不等 大于和小于 大于等于和小于等于 正则表达式匹配 是空值 不是空值 | quantity == 0,temperature != 9999 quantity > 0, quantity < 10 quantity>=1,quantity<=9 quantity matches ‘[01459]’ temperature is null temperature is not null |
布尔型 | x or y x and y not x | 逻辑或 逻辑与 逻辑非 | q == 0 or q == 1 q == 0 and q == 1 not q matches ‘[01459]’ |
函数型平面化 | fn(f1,f2,…) FLATTEN(f) | 在f1,f2等字段上应用函数fn 从包和元组中去除嵌套 | isGood(quantity) FLATTEN(group) |
类型
Pig Latin数据类型
类别 | 数据类型 | 描述 | 文字示例 |
---|---|---|---|
数值 | int long float double | 32位有符号整数 64位有符号整数 32位浮点数 64位浮点数 | 1 1L 1.0F 1.0 |
文本 | chararray | UTF-16格式字符数组 | ‘a’ |
二进制 | Bytearray | 字节数组 | 不支持 |
复杂类型 | tuple bag map | 任何类型的字段序列 元组的无需多重集合 一组键-值对。键必须是字符数组,值可以是任何类型的数据 | (1,’pomegranate’) {(1,’pomegranate’),(2)} {‘a’ ‘pomegranate’} |
需要注意的是:不能根据包文字直接创建一个关系。也不能把元组的一个字段投影为一个关系。
函数
Pig中函数有四种类型
- 计算函数
- 过滤函数
- 加载函数
- 存储函数
计算函数不需要过多解释,过滤函数是用于移出不需要的行。加载函数指明如何从外部存储加载数据到一个关系。存储函数指明如何把一个关系中的内容存到外部存储,如PigStorage。Pig内置函数可以在官网查询。
如果没有需要的函数,也可以自己去写自定义函数。后面我们会详细介绍用户自定义函数。