云计算Pigjoincogroup介绍
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)
上一篇: 开始使用 swift 的 c语言 库
下一篇: 苹果支付正式上线 银行争相高调布局