• Pig关系型运算符例子


    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}
    
  • 相关阅读:
    【回顾整理】HTML+CSS个的两个实战项目
    【转】tkinter实现的文本编辑器
    迟到的tkinter---学校选课刷屏器
    调用有道翻译API
    【leetCode】3Sum Closest
    【LeedCode】3Sum
    【LeedCode】String to integer(atoi)
    【LeetCode】Reverse digits of an integer
    前端工程师必备PS技能
    【LeetCode】Add Two Numbers
  • 原文地址:https://www.cnblogs.com/dreamboy/p/10417919.html
Copyright © 2020-2023  润新知