Pig介绍和相对于Hive的优势

作者: Tim在路上 | 来源:发表于2018-11-05 09:32 被阅读0次

    我们都知道pig和hive的作用是一致的都是为了简化mapReduce的编程而开发的,但是hive是过程化语言SQL,pig是数据流语言pig Latin.

    就工具的选择来说,HiveQL类似于SQL,不需要大量的学习,所以大家在选择工具的时候一般会选择hive.

    但是hive一般擅长处理的是结构化的数据,pig可以处理任何数据。pig还是有一定优势的。

    hive Pig 不同点

    • hive要求数据必须有scheme,但是pig什么都可以操作(结构化,非结构化,半结构化),所以有句俗话pig是家畜,什么都吃。
    • hive安装需要Server,但是pig只有客户端,下载即可使用,家畜管理很方便。

    pig wordcount

    A = LOAD'/logdata/20130131/*/*' AS (line: chararray) ;
    #加载数据
    B = foreach Agenerate flatten(TOKENIZE((chararray)$0)) as word;
    #切分数据
    C = group B by word;
    #将数据分组
    D = foreach Cgenerate COUNT(B), group;
    #统计每组
    E = ORDER D BY ($0);
    
    F = FILTER E BY $0> 200;
    
    DUMP F;
    # 输出
    
    pig Latin的运行

    支持本地和集群运行

    本地

    pig_path/bin/pig –x local wordount.pig 
    

    集群

    PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig wordcount.pig 
    
    pig dfs
     pig -e fs –copyFromLocal local_path hdfs_path  pig hdfs://nn.mydomain.com:9020/myscripts/script.pig
    

    pig -e fs 可以运行hdfs命令

    Pig Latin

    pig 数据类型

    1.基本类型:

    int、long、float(浮点数,一般会丢失精度,要求严格可使用int或者long保证不丢失精度)、double(浮点数,一般会丢失精度,要求严格可使用int或者long保证不丢失精度)
    chararray:字符串或者字符数组。它是通过java.lang.String实现的。chararray常量是以加单引号的一系列字符来表示,例如’fred’。
    bytearray:一团或者一组字节。bytearray是通过封装了java的byte[]的DataByteArray Java类来实现的。

    2.复杂类型

    pig有3个复杂数据类型:map、tuple和bag。
    map:是一种chararray和数据元素之间的键值对映射,其中数据元素可以是任意的pig类型,包括复杂类型。chararray被称为键,它作为查找对应元素的索引,相应的数据元素被称为值。
    map常量通过方括号来划定map结构,键和值间是一个#号,键值对之间使用逗号分隔。如:[‘name’#’bob’,’age#55’]。
    tuple:tuple是一个定长的,包含有序pig数据元素的集合。tuple可以分为多个字段,每个字段对应着一个数据元素。这些数据元素可以是任意的数据类型,它们无须是相同的数据类型。一个tuple相当于sql中的一行,而tuple的字段相当于sql中的列。
    tuple常量使用圆括号来指示tuple结构,使用逗号来划分tuple中的字段。如(‘bob’,55)。
    bag:是一个无序的tuple集合,因为它无序,所以无法通过位置获取bag中的tuple。
    bag常量是通过花括号进行划分的,bag中的tuple用逗号来分隔,如{(‘bob’,55),(‘sally’,52),(‘john’,25)}。
    null值
    在pig中null值所表达的含义是这个值是未知的,这可能是数据缺失,或者在处理数据时发生了错误等原因造成的。

    3.模式

    pig对于模式非常宽松,如果用户为数据定义了一个模式,那么pig会使用这个模式,为的是既可以进行预先的错误检查也可以用于执行过程的优化。如果用户没有为数据提供一个模式,pig仍然可以处理数据,它会根据脚本的如何处理数据的做出一个最合理的猜测。

    数据模式化 LOAD FOREACH STREAM

    可通过LOAD、FOREACH和STREAM三个操作符将数据 模式化

    A = LOAD ‘data’ AS (f1:int, f2:int); // 提倡写法
    A = LOAD ‘data’ AS (f1, f2); //f1和f2均为bytearray
    A = LOAD ‘data’ //可以这样定义,但是schema未知 --
    X = FOREACH A GENERATE f1+f2 AS x1:int; --
    A = LOAD 'data'; B = STREAM A THROUGH `stream.py -n 5` AS (f1:int, f2:int); 
    

    使用load的时候指定数据的格式,默认为bytearray,也可以遍历指定,或者使用其他语言输出指定

    Load操作并不会真正的执行,直到遇到a dump/store操 作 ,所以效率还可以。

    Describe, Dump与Store

    Describe用于描述变量的schema:

    describe combotimes;
    

    Dump将结果打印到终端上:

    DUMP combotimes;
    

    Store将结果保存到目录或者文件中:

    STORE combotimes INTO ‘result/2014’; 
    

    Tokenize函数 用来分割字符串

    group join等

    group name by id,positions by id
    
    join name by id,positions by id
    
    (过滤)
    divs = load 'NYSE_dividends' as (exchange:chararray, symbol:chararray, date:chararray, dividends:float); 
    startswithcm = filter divs by symbol matches 'CM.*'; 
    Distinct(去重):
    -- dictinct.pig daily = load 'NYSE_daily' as (exchange:chararray, symbol:chararray); uniq = distinct daily; 
    Limit(返回N条结果): 
    --limit.pig divs = load 'NYSE_dividends'; first10 = limit divs 10; 
    
    Sample(采样,百分比): 
    --sample.pig divs = load 'NYSE_dividends'; some = sample divs 0.1; 
    Parallel(设置reduce task个数):
    --parallel.pig daily = load 'NYSE_daily' as (exchange, symbol, date, open, high, low, close,              volume, adj_close); bysymbl = group daily by symbol parallel 10; 
    Order by(排序): 
    --order2key.pig daily = load 'NYSE_daily' as (exchange:chararray, symbol:chararray,              date:chararray, open:float, high:float, low:float,              close:float, volume:int, adj_close:float); bydatensymbol = order daily by date desc, symbol; 
    

    相关文章

      网友评论

        本文标题:Pig介绍和相对于Hive的优势

        本文链接:https://www.haomeiwen.com/subject/ktnrxqtx.html