zoukankan      html  css  js  c++  java
  • 大数据之pig 命令

    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脚本的第一行指定上面参数,设置不同的任务名称。

  • 相关阅读:
    C#小型资源管理器
    C#换肤LrisSkin
    面向对象的24种设计模式
    七大设计原则
    非泛型集合和泛型集合
    C#经理评价系统
    深入C#.NET框架
    C#窗口航空总结
    java基础数据结构和语法
    HTML
  • 原文地址:https://www.cnblogs.com/chaoren399/p/4776961.html
Copyright © 2011-2022 走看看