PIG Study

PIG Study


  • 基础概念:

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。


分享到:


相關文章: