一、前言
之前讲解了如何在Linux下通过comm等命令来进行集合操作,那种方法只适合小文件,并且是单机版的。那么对于大文件来说,如何处理呢?可不可以使用分布式操作?
当然是可以使用分布式操作来进行集合操作的。
二、技术原理
-
Pig
Pig是一种数据流语言,用来快速轻松的处理巨大的数据。Pig是基于hadoop的一个数据处理的框架。Pig有一套自己的数据处理语言,Pig的数据处理过程要转化为MR来运行。 -
cogroup
cogroup对多个变量进行group。如下所示,cogroup产生的结果分为三段:第一段是分组的键,第二列是分组键在A中所对应的元素集合所组成的包。第三列是分组建在B中所对应的元素集合所组成的包。
所以利用Pig做分布式集合操作其实很简单:就是你用cogroup操作,若某个分组键对应的A、B包都不为空,则说明此键同时存在于A、B集合中,即此键是A、B交集的一部分;若某个分组键对应的A包为空,B包不为空,则说明此分组建对应的元素只存在于B集合中,而不存在于B集合中,即其是A-B集合中的一部分,反之亦然;不存在分组建对应的A、B包同时为空的情况。
A = load 'input1' as (id:int, val:float); B = load 'input2' as (id:int, val2:int); C = cogroup A by id, B by id; describe C; C: {group: int,A: {id: int,val: float},B: {id: int,val2: int}}
三、示例
-
A、B集合文件。即A={a,b,c,d},B={c,d,e,f}
[hadoop@master pig]$ cat A.txt a b c d [hadoop@master pig]$ cat B.txt c d e f [hadoop@master pig]$
-
求差集A-B
grunt> A = load 'A.txt' as (id:chararray); grunt> B = load 'B.txt' as (id:chararray); grunt> C = cogroup A by id,B by id; grunt> describe C; C: {group: chararray,A: {(id: chararray)},B: {(id: chararray)}} #不可能存在A、B同时为空的情况,否则分组建就不会存在了。 grunt> D = filter C by IsEmpty(B); grunt> dump D; grunt> E = foreach D generate flatten(A); #A=B={a,b}正确 grunt> dump E; (a) (b) grunt>
-
求差集B-A
grunt> D = filter C by IsEmpty(A); grunt> E = foreach D generate flatten(B); #B-A={e,f}正确 grunt> dump E; (e) (f) grunt>
-
求交集
grunt> D = filter C by NOT IsEmpty(B) AND NOT IsEmpty(A); grunt> E = foreach D generate flatten(B); grunt> dump E; #AB={c,d}正确 (c) (d) grunt>
网友评论