欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

云计算Pigjoincogroup介绍

程序员文章站 2022-04-12 21:09:23
join A: (2,Tie) (4,Coat) (3,Hat) (1,Scarf) B: (Joe,2) (Hank,4) (Ali,0) (Ev...

join

A:

(2,Tie)
(4,Coat)
(3,Hat)
(1,Scarf)

B:

(Joe,2)
(Hank,4)
(Ali,0)
(Eve,3)
(Hank,2)

inner join

A = LOAD ‘A’;
B = LOAD ‘B’;
C = JOIN A BY $0, B BY $1;
DUMP C;

output:

(2,Tie,Hank,2)
(2,Tie,Joe,2)
(3,Hat,Eve,3)
(4,Coat,Hank,4)

如果要进行的连接的关系太大,不能全部放到内存当中,则应该使用通用的连接操作。如果有一个关系小到能够全部放在内存中,则可以使用一种特殊的连接操作,即 fragment replicate join,它把小的输入关系发送到所有的mapper,并在map端使用内存查找表对(分段的)较大的关系进行连接。
命令:

C = JOIN A BY $0, B BY $1 USING 'replicated';

注意: 第一个必须是大的数据集,后面则是一个或者多个相对较小的(能够全部放在内存中)。

outer join

C = JOIN A BY $0 LEFT OUTER, B BY $1;

注意:A,B需要明确模式,不然会报错

COGROUP

D = COGROUP A BY $0, B BY $1;

output:

(0,{},{(Ali,0)})
(1,{(1,Scarf)},{})
(2,{(2,Tie)},{(Hank,2),(Joe,2)})
(3,{(3,Hat)},{(Eve,3)})
(4,{(4,Coat)},{(Hank,4)})

COGROUP 和join 操作类似,不同点在于,COGROUP会创建一组嵌套的输出元组集合。如上。

COGROUP 为每个不同的分组键值生成一个元组。每个元组的第一个字段就是那个键值。其他字段是各个关系中匹配该键值的元组所组成的 bag。第一个bag中包含A中有该键值的匹配元组,第二个bag同理。
如果某个键值在一个关系中没有匹配的元组,那么对应于这个关系的bag就未空。
COGROUP的默认类型outer连接。可以使用关键词OUTER来显式指明使用 outer连接,产生的结果相同。

D = COGROUP A BY $0, B BY $1 OUTER;

也可以使用INNER 关键字让COGROUP 使用内连接语义

D = COGROUP A BY $0 INNER, B BY $1;

output:

(1,{(1,Scarf)},{})
(2,{(2,Tie)},{(Hank,2),(Joe,2)})
(3,{(3,Hat)},{(Eve,3)})
(4,{(4,Coat)},{(Hank,4)})

扁平化输出结果:

F = FOREACH D GENERATE FLATTEN(A), B.$0;

输出:

(1,Scarf,{})
(2,Tie,{(Hank),(Joe)})
(3,Hat,{(Eve)})
(4,Coat,{(Hank)})

让所有输出结果都扁平化

G = COGROUP A BY $0 INNER, B BY $1 INNER;
H = FOREACH G GENERATE FLATTEN($1),FLATTEN($2);

输出:

(2,Tie,Hank,2)
(2,Tie,Joe,2)
(3,Hat,Eve,3)
(4,Coat,Hank,4)

这和上面的join 结果是一样的。

CROSS

CROSS 笛卡尔积。会将第一个关系中的每个元组和第二中的所有元组进行连接。这个操作的输出结果的大小是输入关系的大小的乘积。

I = CROSS A, B;

输出:

(1,Scarf,Hank,2)
(1,Scarf,Eve,3)
(1,Scarf,Ali,0)
(1,Scarf,Hank,4)
(1,Scarf,Joe,2)
(3,Hat,Hank,2)
(3,Hat,Eve,3)
(3,Hat,Ali,0)
(3,Hat,Hank,4)
(3,Hat,Joe,2)
(4,Coat,Hank,2)
(4,Coat,Eve,3)
(4,Coat,Ali,0)
(4,Coat,Hank,4)
(4,Coat,Joe,2)
(2,Tie,Hank,2)
(2,Tie,Eve,3)
(2,Tie,Ali,0)
(2,Tie,Hank,4)
(2,Tie,Joe,2)

GROUP

GROUP语句是对已个数据集中的数据进行分组。GROUP支持对键值进行分组,还可以使用表达式或者用户自定义函数作为分组键。

数据集A:

(Joe,cherry)
(Ali,apple)
(Joe,banana)
(Eve,apple)

根据第二个字符个数进行分组:

B = GROUP A BY SIZE($1);
DUMP B;

output:

(5,{(Eve,apple),(Ali,apple)})
(6,{(Joe,banana),(Joe,cherry)})

sort

数据集:

(2,3)
(1,2)
(2,4)

使用ORDER关键字 自定按照某个或者某几个字段对数据进行排序。默认的排序方式是对具有相同类型的字段值使用自然序排序。

B = ORDER A BY $0, $1 DESC;

输出:

(1,2)
(2,4)
(2,3)

但是,对于排序后的结果集的后续处理,并不能保证一定按照排序的结果输出,所以通常只在获取结果前一步才使用ORDER排序。
LIMIT 就像sql中的limit一样,限制结果大小,快速获取结果。

D = LIMIT B 2;
DUMP D;
(1,2)
(2,4)

UNION

DUMP A;
(2,3)
(1,2)
(2,4)
DUMP B;
(z,x,8)
(w,y,1)
C = UNION A, B;
DUMP C;
(2,3)
(z,x,8)
(1,2)
(w,y,1)
(2,4)