- 基础概念:
Pig是基于hadoop的一个数据处理的框架。
Pig的数据处理语言是数据流方式的,类似于初中做的数学题。
Pig基本数据类型:int、long、float、double、chararray、bytearray
复合数据类型:Map、Tuple、Bag
和数据库的对应关系:
<code>pig database relation/bag table tuple one record field field(one volume)/<code>
但是pig中tuple的字段数是随意的,这点和数据库不同
- 运行模式以及注释:
运行模式
a) 本地
i. pig –x local
b) 集群
i. pig –x mapreduce
ii. 或者pig
c) 批处理命令
i. 将命令批量写入xx.pig
ii. 用本地或者集群模式运行,如pig xx.pig
注释
a) 段落注释:/**/
b) 行注释: --
- 基本用法框架:
a) 输入
i. A = Load ‘输入路径’ USING PigStorage(“\t”) AS (name:chararray, age:int, gpa:float);
ii. 逻辑:用pig自带的PigStorage读入输入路径的数据,对每一行用”\t”分割,并用字符串类型的name、int类型的age、float类型的gpq作为每行数据的字段名
b) 中间处理
i. B = FOREACH A GENERATE name;
c) 输出
i. DUMP B; --输出到控制台
ii. 或者STORE B INTO ‘输出路径’ USING PigStorage();
- 基本语法实例:
计算多维度组合下的平均值 的实际例子
需求:求文件中第2、3、4组合的第4、5列的平均值
脚本解释:
<code>A = Load '1.txt' USING PigStorage(' ') AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);/<code>
A的结构是
<code>{col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double)}/<code>
<code>B = GROUP A BY (col2, col3, col4);/<code>
对A用col2/col3/col4的组合进行分组,然后按组将每条tuple汇集成一个bag,B的数据结构是B:{group:(col2,col3,col4),A:bag{:tuple,tuple}}
<code>C = FOREACH B GENERATE group, AVG(col5), AVG(col6);/<code>
FOREACH是遍历每个组中汇集的tuple,并对其用组合函数处理字段C的结构是C:{group:(col2,col3,col4),double,double}
<code>DUMP C;//单机运行打印调试信息 STORE C INTO “output”;//存储结果/<code>
统计行数
<code>A = LOAD '1.txt' USING PigStorage (' ‘) AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double); B = GROUP A all; C = FOREACH B GENERATE COUNT(col2); DUMP C;/<code>
注意:如果col2这一列有NULL,则这一行将不会被统计。
GROUP A all;没有by关键字。
FLATTEN
同1中的例子,但是C不同
<code>C = FOREACH B GENERATE FLATTEN(group), AVG(col5), AVG(col6);/<code>
1中的例子得到的结果结构是(col2, col3, col4),avg1,avg2
但是对group作用FLATTEN后结构变为col2,col3,col4,avg1,avg2;可以看出FLATTEN的作用是解嵌套(un-nest)包或者元组tuple,
GROUP的两点说明:
a)用于GROUP的key如果多于一个字段(正如本文前面的例子),则GROUP之后的数据的key是一个元组(tuple),否则它就是与用于GROUP的key相同类型的东西
b)GROUP后得到的结果是一个包或者是relation,其包含的每一个tuple中包含两个字段,第一个字段被命名为'group',第二个字段是一个包,是含有group对应值的所有tuple的set。