码迷,mamicode.com
首页 > 其他好文 > 详细

大数据之pig 命令

时间:2015-09-02 00:12:46      阅读:4572      评论:0      收藏:0      [点我收藏+]

标签:

1.pig与hive的区别

pig和hive比较类似的,都是类sql的语言,底层都是依赖于hadoop
    走的mapreduce任务。
    pig和hive的区别就是,想要实现一个业务逻辑的话,使用pig需要一步一步操作
    而使用hive的话一条SQL就可以搞定。
    如果想在很短时间内获取一个比较复杂的业务逻辑处理结果的话,建议使用pig。
    如果需要定时执行的一些任务,建议使用hive。

 

2:pig和mapreduce对比


    pig优点:针对一些基本的处理逻辑,已经做好了封装,直接使用对应的命令即可。
        但是使用mapreduce代码的话就需要我们自己实现了,并且使用pig还不需要
        考虑代码的优化。
        使用mapreduce的话会出现数据倾斜的问题,但是使用pig可以避免这个问题。

3:pig的应用场景


    最主要的就是数据清洗

 

4:pig的使用方式


    1:在pig(grunt)命令行下执行命令
    2:在shell命令下执行
        bin/pig -e "A = load ‘a.txt‘ as (id:int,name:chararray);dump A;"
    3:使用脚本来执行
        vi my.pig
        -- 单行注释
        /*
        多行注释
        */
        A = load ‘a.txt‘ as (id:int,name:chararray);
        dump A;
       
       
        执行命令
        bin/pig my.pig

5:pig里面的数据类型


    基本数据类型
    int、long、float、double、chararray、bytearray、boolean、datetime、biginteger、bigdecimal
    注意:chararray,表示字符串类型
   
    复合数据类型
    tuple、bag、map
    注意:
    tupe (1,2,3)
    bag     {(1,2,3),(1,2,3),(1,2,3)}
    map [key#value]

   
6:pig中的一些命令

 

load:加载数据
    A = load ‘a.txt‘ as (id:int,name:chararray)
    注意:as 后面指定的文件数据结构信息,这个表示会在当前目录下找a.txt文件,
        根据(id:int,name:chararray)对文件中的数据进行解析。这样需要确保文件中
        这两列数据中间是使用制表符分割的。
       
        如果加载的数据中多个列之间不是使用制表符分割的,那么在加载数据的时候
        就需要执行指定分割符了,例子中是使用逗号进行分割的。
        例子:A = load ‘a.txt‘ using PigStorage(",") as (id:int,name:chararray);
       
        A 和 = 之间必须有空格。建议命令之间都加上空格,这样看起来简洁,也不容易出错。

       
    describe:类似于sql中的查看表结构
   
    例子:describe A;
   
   
    group : 分组,类似于sql中的groupby
   
    例子:B = group A by id;
   
    foreach:对结果集中的数据进行迭代处理
    例子:C = foreach A generate id ,name;
        或者也可以使用$0类似的命令来获取结果集中的数据
        C = foreach A generate $0 ,$1;
       
       
    filter:过滤
    例子:D = filter A by id ==‘zs‘;
        常用的表达式:    ==
                        !=
                        >=
                        <=
                        >
                        <
   
    join:类似于sql中的表链接
    内链接:
        C = join A by id,B by id;
    外连接
        左外连接:C = join A by id left outer,B by id;
            在查询数据的时候,以左侧数据为基准,只返回左侧有的数据
        右外连接:C = join A by id right outer,B by id;
            在查询数据的时候,以右侧数据为基准,只返回右侧有的数据。
        全外连接:C = join A by id full outer,B by id;
            在查询数据的时候,两侧数据都可以返回。
   
   

 

7:pig的命令


    limit:类似于sql中的limit,可以获取数据集中的一部分数据
    例子:B = limit A 10;(取前10条数据)
    此种方式pig仍会读取所有数据,只是在返回的时候返回指定条数的数据
   
    order by:排序,类似于sql中的order by
    例子:B = order A by id;
        默认是正序,想到倒序的话需要在指定字段后面添加desc;
        order by后面可以指定多个分组字段。
        order A by id desc, name desc (对A中的数据进行排序,先根据ID进行倒序排列,如果ID相等,那么使用name字段进行倒序排序。)
   
    SPLIT:根据条件对数据集进行切分
    例子:split A into x1 if x>10 ,x2 if x==20 ,x3 if (x>1 and x<10);
   
    union:类似于sql中的union all
    例子:C = union A, B;
    一般情况下使用union操作的两个临时变量的数据结构都一样,
    如果不一样,可以分下面两种情况
        1:A 中id字段是float类型的,B中的id字段是double类型的,这样的话float可以转换成double,所以使用union之后生成的临时变量C中id就是double类型的。
        2:A 中id字段是float类型的,B中的id字段是chararray类型的,这样的话两种数据类型不能想换转换,所以执行会报错。

 

8:pig命令的注意事项


    1:所有命令都是以;结尾
    2:Pig对命令的大小写没有规定,可以使用大写,也可以小写,但是,针对pig中的函数就必须使用大写,因为这些函数在pig中定义的时候就是大写。
        针对PIG处理过程中的临时变量的名称,大小写也是有区分的。
    3:在pig中执行的命令其实并不会真正的执行,只有当执行dump或者store命令的时候才会真正指定之前定义的命令。
    4:如果某一条命令执行失败了,那么只需要修改这条命令,重新执行即可。


9:pig命令行的扩展


    fs:可以在pig中执行hdfs中的命令
    sh:可以在pig中执行shell命令(在0.8版本之后才有)
    clear:清屏
    exec:在pig命令行下执行pig脚本  例子:pig my.pig
    history:查看在pig命令行下执行的命令记录
    quit:退出pig命令行


10:pig中的内建函数


    avg:求平均数
        例子:B = group A by id;
            C = foreacg B generate group,AVG(score);
           
    SUM:求和
    MAX:求最大值
    MIN:求最小值
   
    上面这几个函数使用方法一样。
    注意:函数名称必须要大写。
   
    COUNT():求总数。
        1:先分组,再求和。和上面的用法一致。
        2:执行类似于select count(*) from table操作。
            这样的话也需要对table中的分组,因为是要求所有的数据总数,所以可以把所有数据分到一个组里面,
            使用B = group A all;(all相当于是一个关键字)
            再使用C = foreach B generate COUNT(A);
   

 

10:pig中自定义函数


    使用java代码自定义函数,需要创建一个类,集成evalFunc类,实现为实现的exec函数,在这里面就可以对数据进行处理。
    先添加maven依赖
    <dependency>
        <groupId>org.apache.pig</groupId>
        <artifactId>pig</artifactId>
        <version>0.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0</version>
    </dependency>
       
   
    package pig;
    import java.io.IOException;
    import org.apache.pig.EvalFunc;
    import org.apache.pig.data.Tuple;
    public class UPPER extends EvalFunc<String> {
        @Override
        public String exec(Tuple input) throws IOException {
            if(input==null || input.size()==0 || input.get(0)==null){
                return null;
            }
            try {
                String str = (String)input.get(0);
                return str.toUpperCase();
            } catch (Exception e) {
                throw new IOException("转换大写失败 ", e);
            }
        }
    }
   
    代码实现完之后就需要打包了。
    在这打包的话不需要打依赖,直接在eclipse中右键export导出为一个jar即可。
   
    在把这个jar放到pig所在的服务器上,建议放在pig的根目录下面。
   
    后面想使用这个函数的时候,需要先把这个jar在pig中注册一下
    register myudf.jar
   
    下面就可以使用前面定义的函数了。
    例子:
    -- vi myscript.pig
    REGISTER myudfs.jar;
    A = LOAD ‘a.txt‘ AS (name: chararray, age: int);
    B = FOREACH A GENERATE pig.UPPER(name);
    DUMP B;

    pig -x local myscript.pig
   
   
11:实战一(wlan上网日志处理)


    1:先把数据上传到服务器上
    2:在pig中加载这些数据
    A = LOAD ‘HTTP_20130313143750.dat‘ AS (reportTime:long, msisdn:chararray, apmac:chararray, acmac:chararray, host:chararray, siteType:chararray, upPackNum:long, downPackNum:long, upPayLoad:long, downPayLoad:long, httpStatus:chararray);
    3:截取需要的数据
    B = FOREACH A GENERATE msisdn, upPackNum, downPackNum, upPayLoad, downPayLoad;
    4:对数据进行分组
    C = GROUP B BY msisdn;   
    5:对上行,下行数据进行统计
    D = FOREACH C GENERATE  group, SUM(B.upPackNum), SUM(B.downPackNum), SUM(B.upPayLoad), SUM(B.downPayLoad);
    6:存储清洗的结果
    STORE D INTO ‘wlan_result‘;

 

12:实战二(tomcat访问日志处理)


    统计PV和UV
    pv:其实就是统计文件中数据的总条数
    UV:其实就是统计文件中独立ip出现的次数
   
    1:把数据上传到服务器
    2:使用pig加载数据
    A = load ‘access_2015_03_30.log‘ USING PigStorage(‘ ‘) as (ip:chararray,one:chararray,two:chararray,time:chararray,timezone:chararray,method:chararray,url:chararray,http:chararray,statu:long,data:long);
    注意:这个日志文件中数据列之间是使用空格隔开的,所以在使用load的时候需要指定分隔符
    3:截取需要的数据
    B = foreach A generate  ip,url;
    4:统计PV
        1)对B中的数据进行分组,都分到一组,使用all关键字
        C = group B all;
        2)在使用count函数求和
        PV = foreach C generate COUNT(B);
    5:统计UV
        1)对B中的数据进行分组,使用ip作为分组字段,这样可以保证分组之后这个分组字段的值是不重复的。
        C = group B by ip;
        2)对分组之后的C中的数据进行处理,由于只需要统计独立IP,所以只需要获取分组字段即可
        D = foreach C generate group;
        3)对D中的数据再使用all关键字分组,分到一个all组里面
        E = group D all;
        4)使用count函数统计独立IP的总数
        UV = foreach E generate COUNT(D);
    6:把pv和uv整合到一块
        PV_UV = join PV by ‘1‘,UV by ‘1‘;
    7:还需要在PV和UV的数据里面加上时间字段
        END = foreach PV_UV generate ‘2013-05-30‘,$0,$1;
    8:把清洗的数据结果保存起来
        store END into ‘pv_uv‘;
   
   


13:pig扩展


    设置pig中mr任务的名称
    set job.name ‘my-job-name‘;
   
    建议在使用pig脚本的时候,在每个pig脚本的第一行指定上面参数,设置不同的任务名称。

大数据之pig 命令

标签:

原文地址:http://www.cnblogs.com/chaoren399/p/4776961.html

(0)
(3)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!