Pig 进行分布式集合操作(交集、差集)

2019-01-01  本文已影响0人  鹅鹅鹅_

一、前言


之前讲解了如何在Linux下通过comm等命令来进行集合操作,那种方法只适合小文件,并且是单机版的。那么对于大文件来说,如何处理呢?可不可以使用分布式操作?
当然是可以使用分布式操作来进行集合操作的。

二、技术原理


  1. Pig
    Pig是一种数据流语言,用来快速轻松的处理巨大的数据。Pig是基于hadoop的一个数据处理的框架。Pig有一套自己的数据处理语言,Pig的数据处理过程要转化为MR来运行。

  2. 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}}
    

三、示例


  1. 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]$ 
    
  2. 求差集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>
    
  3. 求差集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>
    
  4. 求交集

    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>
    
上一篇 下一篇

猜你喜欢

热点阅读