手记

Pig介绍和相对于Hive的优势

我们都知道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均为bytearrayA = 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,



作者:张晓天a
链接:https://www.jianshu.com/p/cc065d126fc5


0人推荐
随时随地看视频
慕课网APP