大数据之pig 命令

网友投稿 337 2022-11-23

大数据之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依赖            org.apache.pig        pig        0.14.0                org.apache.hadoop        hadoop-client        2.6.0                    package pig;    import java.io.IOException;    import org.apache.pig.EvalFunc;    import org.apache.pig.data.Tuple;    public class UPPER extends EvalFunc {        @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, 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,注意:这个日志文件中数据列之间是使用空格隔开的,所以在使用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脚本的第一行指定上面参数,设置不同的任务名称。

岁月里,寒暑交替。人世间,北来南往。铭心的,云烟的。都付往事,不念,不问。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:是德科技推出新型汽车串行器/解串器接收机合规性测试解决方案
下一篇:hadoop1.2.1伪分布模式安装教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~