1.新建两个文件A.txt与B.txt,

A.txt文件的内容如下:

0,1,2

1,3,4

B.txt文件的内容如下:

0,5,2

1,7,8

将这两个文件上传到目录/zwy/soft

2.定义关系a与b,代码如下

grunt> a = load '/zwy/soft/A.txt' using PigStorage(',') as (a1:int,a2:int,a3:int);
grunt> b = load '/zwy/soft/B.txt' using PigStorage(',') as (b1:int,b2:int,b3:int);

3.测试输出a与b的内容

grunt>DUMP a;
(0,1,2)
(1,3,4)
grunt>DUMP b;
(0,5,2)
(1,7,8)

4.UNION命令,将多个关系归并在一起

grunt> c =UNION a , b ;
grunt> DUMP c;
(0,5,2)
(1,7,8)
(0,1,2)
(1,3,4)

UNION运算符允许重复。可以使DISTINCT运算符来对关系进行去重( dis = distinct c;)。

5.SPLIT命令,将一个关系分割为多个

grunt> SPLIT c INTO d IF $0 == 0 , e IF $0 == 1;
grunt> DUMP d;
(0,1,2)
(0,5,2)
grunt> DUMP e;
(1,3,4)
(1,7,8)

在c上的SPLIT操作将一个元组传给另一个关系,如果第一个字段($0)为0,则送到d,如果为1,则送到e。

6.FILTER命令,将一个关系裁剪为能够通过某种测试的元组

grunt> f = FILTER c BY $1 > 3;
grunt> DUMP f;
(0,5,2)
(1,7,8)

过滤出每个元组中第二个元素大于3的元组

7.SAMPLE命令,LIMIT被用于从一个关系中取出指定个数的元组,而SAMPLE运算符则根据特定的比例从一个关系中随机地取样出元组。

用法为:“SAMPLE 别名 size,size范围[0, 1]”

grunt> c_sample = SAMPLE c 0.4 ;
grunt> DUMP c_sample;
(1,3,4)
(0,5,2)

每次执行DUMP c_sample;输出的结果都会不一样

8.GROUP命令,对元组按某一列进行分组

runt> g = GROUP c BY $2 ;
grunt> DUMP g;
(2,{(0,1,2),(0,5,2)})
(4,{(1,3,4)})
(8,{(1,7,8)})
grunt> DESCRIBE c;
c: {a1: int,a2: int,a3: int}
grunt> DESCRIBE g;
g: {group: int,c: {(a1: int,a2: int,a3: int)}}

上面操作生成了一个新的关系g ,它是对c中第3列 ($2 ,也被命名为a3) 相同的元组进行组合的结果。

GROUP的输出通常有两个字段。第一个字段为组键,这里是a3。第二个字段是一个bag (包) ,包含组键相同的所有元组。

观察g的dump值,我们看到它有3个元组,对应于c中第3列的3个专有值。第一个元组中的包代表c中第3列等于2的所有元组。在第二个元组中的包代表c中第3列等于4的所有元组,以此类推。

GROUP输出关系的第一个字段总是名为“group”,代表组键。这里似乎把第一个字段叫做“a3”更自然些,但是当前Pig并不允许你指定其它名字来取代“group”。

GROUP输出关系的第二个字段通常以其操作的关系为名,这里是“c”,它总是一个包。由于这个包承载了来自c的元组,因此这个包的schema与c的schema相同,由整数构成的3个字段分别被命名为a1、a2和a3。

使用GROUP时,可以把关系中的所有元组都放入一个大的包中,这有助于对关系进行聚集分析,因为函数是对包而不是对关系进行操作。例如:

grunt> h = GROUP c ALL ;
grunt> DUMP h;
(all,{(1,3,4),(0,1,2),(1,7,8),(0,5,2)})
grunt> i = FOREACH h GENERATE COUNT($1);
grunt> dump i ;

上述代码是计算c中元组个数的一种方法。GROUP ALL输出的第一个字段总是字符串“all”

9.JOIN命令,类似于SQL JOIN,通过两个或多个表中的键将不同的关系联系起来

grunt > j= JOIN a BY $2 , b BY $2;
grunt > dump j;
(0,1,2,0,5,2)
grunt> DESCRIBE j;
j: {a::a1: int,a::a2: int,a::a3: int,b::b1: int,b::b2: int,b::b3: int}

左外连接示例如下:

grunt > l= JOIN a BY $2 LEFT OUTER , b BY $2;
grunt > dump l;
(0,1,2,0,5,2)
(1,3,4,,,)

全外连接示例如下:

grunt > f = JOIN a BY $2 FULL , b BY $2;
grunt > dump f;
(0,1,2,0,5,2)
(1,3,4,,,)
(,,,1,7,8)

右外连接示例如下:

grunt > f = JOIN a BY $2 RIGHT OUTER , b BY $2;
grunt > dump f;
(0,1,2,0,5,2)
(,,,1,7,8)

10.FOREACH和FLATTEN,浏览一个关系中的所有元组,并在输出中生成新的元组

grunt> k = FOREACH c GENERATE a2, a2 * a3;
grunt> DUMP k;
(1,2)
(3,12)
(5,10)
(7,56)

FLATTEN函数可以移除嵌套的层次,将嵌套式数据类型平坦化,几乎就是建包的反向操作。FLATTEN函数可以改变由FOREACH…GENERATE产生输出的结构,其平坦化的特性也会根据应用方式和应用目标的不同而有所不同。例如,语句FOREACH…GENERATE $0 , FLATTEN ($1)会为每个输入元组生成一个形式为(a,b,c)的输出元组,代码如下。

grunt> k = FOREACH g GENERATE group, FLATTEN(c);
grunt> DUMP k;
(2,0,1,2)
(2,0,5,2)
(4,1,3,4)
(8,1,7,8)
grunt> DESCRIBE k;
k: {group: int,c::a1: int,c::a2: int,c::a3: int}

Pig关系型运算符例子的更多相关文章

  1. pig分组统计例子

    1.选取数据样本 在pig安装目录下有一个文件tutorial/data/excite-small.log,其中的数据分为3列,中间用制表符分隔,第一列为用户ID,第二列为Unix时间戳,第三列为查询 ...

  2. sql关系型运算符优先级高到低为:not >and> or

    今天在做项目的时候发现一个查询的结果不太对. 随后拿出sql仔细端详一番,where条件中发现一个条件本应该是 …… xx in (‘13’,‘14’)……,却写成了…… xx = ‘13’ or x ...

  3. Pig Latin程序设计1

    Pig是一个大规模数据分析平台.Pig的基础结构层包括一个产生MapReduce程序的编译器.在编译器中,大规模并行执行依据存在.Pig的语言包括一个叫Pig Latin的文本语言,此语言有如下特性: ...

  4. pig(数据流语言和编译器)学习https://www.w3cschool.cn/apache_pig/apache_pig_execution.html

    当我们配置了hadoop集群执行的时候 可以通过命令ls进行查看 存储语法 STORE Relation_name INTO ' required_directory_path ' [USING fu ...

  5. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)

    上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑

  6. LIKE 运算符

    运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是"+".在vb2005中运算符大致可以分为5种类型:算术运算符.连接运算 ...

  7. 前端学PHP之运算符

    × 目录 [1]总括 [2]算术运算符 [3]赋值运算符[4]位运算符[5]比较运算符[6]错误控制[7]逻辑运算符[8]字符串连接[9]数组运算符 前面的话 运算符是可以通过给出的一或多个表达式来产 ...

  8. java中的算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符

    一.算术运算符 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例 ...

  9. JavaScript 运算符

    JavaScript 运算符 JavaScript 运算符用于赋值,比较值,执行算术运算等. JavaScript 算术运算符 算术运算符用于执行两个变量或值的运算. 赋值 y = 5, 以下表格将向 ...

随机推荐

  1. keras 多输出问题

    转自:https://github.com/Xls1994/DeepLearningCode/blob/master/Keras/HedgeScope/multiOutputLSTM.py

  2. checkpoint(sqlserver数据库检查点)

    关于检查点的解释:   出于性能方面的考虑,数据库引擎对内存(缓冲区缓存)中的数据库页进行修改,但在每次更改后不将这些页写入磁盘.相反,数据库引擎定期发出对每个数据库的检查点命令.“检查点”将当前内存 ...

  3. JAVA利用poi获取world文件内容

    本文主要简单介绍了利用poi包,读取world文件内容. 这个依然存在版本的问题,只能读取doc结尾的老版本文件. 话不多说,上代码: import java.io.File; import java ...

  4. leetcode 198、打家劫舍

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  5. NO.008-2018.02.13《折桂令·春情》元代:徐再思

    折桂令·春情_古诗文网   折桂令·春情 元代:徐再思 平生不会相思,才会相思,便害相思.生下来以后还不会相思,才刚刚懂了什么是相思,却深受着相思之苦. 身似浮云,心如飞絮,气若游丝.身像飘浮的云,心 ...

  6. Full scan vs index 执行计划的实验

    根据Oracle-L邮件列表里主题「 Full scan vs index 」的讨论而来. 1.测试环境创建 SYS@HEMESRHTDB2(1.206)> select * from v$ve ...

  7. 动态规划(DP),压缩状态,插入字符构成回文字符串

    题目链接:http://poj.org/problem?id=1159 解题报告: 1.LCS的状态转移方程为 if(str[i-1]==str[j-1]) dp[i][j]=dp[i-1][j-1] ...

  8. 利用Graphviz画出图

    graphviz官网:http://www.graphviz.org/ 背景:有画图需要,之前见到别人用graphviz画,画出来的图漂亮,且自动帮你排版安排布局,所以自己想尝试用它画. 其中遇到的几 ...

  9. POJ 3616 Milking Time(加掩饰的LIS)

    传送门: http://poj.org/problem?id=3616 Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  10. focal loss for dense object detection

    温故知新 focal loss for dense object detection,知乎上一人的评论很经典.hard negative sampling, 就是只挑出来男神(还是最难追的),而foc ...