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 命令的更多相关文章

  1. 大数据之pig安装

    大数据之pig安装 1.下载 pig download 2. 解压安装 mapreduce模式安装: 1:设置HADOOP_HOME,如果pig所在节点不是集群中的节点,那就需要把集群中使用的hado ...

  2. 大数据-Hive 常用命令

    Hive 启动 ~$ hive 退出 hive>quit; --退出hive or hive> exit; --exit会影响之前的使用,所以需要下一句kill掉hadoop的进程 > ...

  3. GreenPlum 大数据平台--常用命令

    gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定数据目录(默认值:$MASTE ...

  4. 入门大数据---HBase Shell命令操作

    学习方法 可以参考官方文档的简单示例来 点击查看 可以直接在控制台使用help命令查看 例如直接使用help命令: 从上图可以看到,表结构的操作,表数据的操作都展示了.接下来我们可以针对具体的命令使用 ...

  5. 大数据测试之hadoop命令大全

    1.列出所有Hadoop Shell支持的命令 $ bin/hadoop fs -help2.显示关于某个命令的详细信息 $ bin/hadoop fs -help command-name3.用户可 ...

  6. 大数据 - spark-sql 常用命令

    --spark启动 spark-sql --退出 spark-sql> quit; --退出spark-sql or spark-sql> exit; 1.查看已有的database sh ...

  7. 大数据学习之路之Hadoop

    Hadoop介绍 一.简介 Hadoop是一个开源的分布式计算平台,用于存储大数据,并使用MapReduce来处理.Hadoop擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化的处理.两个核心: ...

  8. 大数据每日干货第四天(linux基础之一目录结构与常用命令)

           为了和qq空间同步,也写的第四天,前面几天明天会发布,本来打算把每天学的东西记录下来,通过朋友给的建议要发的话稍微系统化下,从大数据需要的linux基础,到离线数据分析包括hadoop. ...

  9. 大数据系列之数据仓库Hive命令使用及JDBC连接

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

随机推荐

  1. Groupby - collection processing

    Groupby - collection processing Iterator and Iterable have most of the most useful methods when deal ...

  2. 事务块TransactionScope使用

    TransactionScope 可以让代码块成为事务性代码块. 当发生异常时,会自动回滚.后期手动提交事务. 简单的例子: using (TransactionScope ts = new Tran ...

  3. Linux Command Line Basics

    Most of this note comes from the Beginning the Linux Command Line, Second Edition by Sander van Vugt ...

  4. POJ 1804 Brainman(归并排序)

    传送门 Description Background Raymond Babbitt drives his brother Charlie mad. Recently Raymond counted ...

  5. [JavaEE]理解ThreadLocal

    转http://www.iteye.com/topic/103804 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中 ...

  6. 云计算之KVM安装(二)

    云计算之KVM安装(二) 调整虚拟机 虚拟化Intel使用的是intel VT-X AMD使用的是AMD-V 创建虚拟机步骤 1.准备虚拟机硬盘 2.需要系统iso镜像 3.需要安装一个vnc的客户端 ...

  7. 《JavaScript权威指南》学习笔记 第一天。

    这是零零散散的笔记,作为自己看书打demo的笔记.不足为各位学习,留作自己复习知识点备用. 1.检测对象中某个属性存在不存在: <script> // in 运算符 //不管是对象的自有属 ...

  8. Java包装类

    自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类 自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型 要把基本数据类型称为对象的时候,需要把基本数据类型进行包装, 运用: ...

  9. CodeForces 710A King Moves(水题-越界问题)

    题目链接:http://codeforces.com/problemset/problem/710/A 题目大意:在一个棋盘中给出一个位置,判断该位置周围8个点还有几个点可以摆放棋子. AC代码解释解 ...

  10. C++ 生成 dll 和调用 dll 的方法实例(转)

    1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#e ...