当前位置: 移动技术网 > 科技>人工智能>云计算 > 云计算Pigjoincogroup介绍

云计算Pigjoincogroup介绍

2018年03月25日  | 移动技术网科技  | 我要评论

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)

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网