我们都知道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
代码语言:javascript复制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的运行
支持本地和集群运行
本地
代码语言:javascript复制pig_path/bin/pig –x local wordount.pig
集群
代码语言:javascript复制PIG_CLASSPATH=hadoop_conf_dir pig_path/bin/pig wordcount.pig
pig dfs
代码语言:javascript复制 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三个操作符将数据 模式化
代码语言:javascript复制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:
代码语言:javascript复制describe combotimes;
Dump将结果打印到终端上:
代码语言:javascript复制DUMP combotimes;
Store将结果保存到目录或者文件中:
代码语言:javascript复制STORE combotimes INTO ‘result/2014’;
Tokenize函数 用来分割字符串
group join等
代码语言:javascript复制group name by id,positions by id
代码语言:javascript复制join name by id,positions by id
代码语言:javascript复制(过滤)
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;
代码语言:javascript复制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;