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;
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)
如上示例,可以对两个数据集不同或者字段数不同的数据集进行UNION操作。
SPLIT 操作是UNION操作的相反操作。