Pig group用法举例

group语句可以把具有相同键值的数据聚合在一起,与SQL中的group操作有着本质的区别,在SQL中group by字句创建的组必须直接注入一个或多个聚合函数。在Pig Latin中group和聚合函数之间没有直接的关系。

group关键字正如它字面所表达的:将包含了特定的键所对应的值的所有记录封装到一个bag中,之后,用户可以将这个结果传递给一个聚合函数或者使用它做其他一些处理。

触发reduce阶段

数据文件内容如下:

[[email protected] ~]$ cat orders.data
1       apple   30    x
2       apple   50    x
3       banana  30    y
4       pear    20    y
5       banana  10    y
[[email protected] ~]$

  

加载数据并分组

data = load ‘/orders.data‘ as (orderid:int, fruit:chararray, amount:int);
grpd = group data by fruit;

  

查看分组后的数据模式

分组后的数据只有两个字段:group(分组字段)、数据(列名是被分组的数据集别名,数据是所有数据组成的bag。

describe grpd;
grpd: {group: chararray,data: {(orderid: int,fruit: chararray,amount: int)}}

  

查看分组数据

dump grpd;
(pear,{(4,pear,20)})
(apple,{(2,apple,50),(1,apple,30)})
(banana,{(5,banana,10),(3,banana,30)})

  

使用聚合函数对分组后的结果集进行处理:

dump grpd;
(pear,{(4,pear,20)})
(apple,{(2,apple,50),(1,apple,30)})
(banana,{(5,banana,10),(3,banana,30)})
group data by $0+$1;

  

对多个键分组

分组后的数据有两个字段,一个是别名是group的tuple,一个是聚合了本组数据的bag

group data by (filed1, field2)

orders = load ‘/orders.data‘ as (orderid:int, fruit:chararray, amount:int, type:chararray);
grpd = group orders by (fruit, type);
describe grpd;
grpd: {group: (fruit: chararray,type: chararray),orders: {(orderid: int,fruit: chararray,amount: int,type: chararray)}}
dump grpd;
((pear,y),{(4,pear,20,y)})
((apple,x),{(2,apple,50,x),(1,apple,30,x)})
((banana,y),{(5,banana,10,y),(3,banana,30,y)})

  

sums = foreach grpd generate group, SUM(orders.amount);
dump sums;
((pear,y),20)
((apple,x),80)
((banana,y),40)

  

sums2 = foreach grpd generate group.$0, group.$1, SUM(orders.amount);
dump sums2;
(pear,y,20)
(apple,x,80)
(banana,y,40

  

group all 将数据集的所有数据放到一个分组里

grpd = group orders all;
describe grpd;
grpd: {group: chararray,orders: {(orderid: int,fruit: chararray,amount: int,type: chararray)}}
dump grpd;
(all,{(5,banana,10,y),(4,pear,20,y),(3,banana,30,y),(2,apple,50,x),(1,apple,30,x)})

  

co-group多个数据集group

A = LOAD ‘data1‘ AS (owner:chararray,pet:chararray);
DUMP A;
(Alice,turtle)
(Alice,goldfish)
(Alice,cat)
(Bob,dog)
(Bob,cat)
B = LOAD ‘data2‘ AS (friend1:chararray,friend2:chararray);
DUMP B;
(Cindy,Alice)
(Mark,Alice)
(Paul,Bob)
(Paul,Jane)
X = COGROUP A BY owner, B BY friend2;
DESCRIBE X;
X: {group: chararray,A: {owner: chararray,pet: chararray},B: {friend1: chararray,friend2: chararray}}
DUMP X;
(Alice,{(Alice,turtle),(Alice,goldfish),(Alice,cat)},{(Cindy,Alice),(Mark,Alice)})
(Bob,{(Bob,dog),(Bob,cat)},{(Paul,Bob)})
(Jane,{},{(Paul,Jane)})

  

partition by parallel n

A = LOAD ‘input_data‘;
B = GROUP A BY $0 PARTITION BY org.apache.pig.test.utils.SimpleCustomPartitioner PARALLEL 2;

  

SimpleCustomPartitioner:

public class SimpleCustomPartitioner extends Partitioner <PigNullableWritable, Writable> {
     //@Override
    public int getPartition(PigNullableWritable key, Writable value, int numPartitions) {
        if(key.getValueAsPigType() instanceof Integer) {
            int ret = (((Integer)key.getValueAsPigType()).intValue() % numPartitions);
            return ret;
       }
       else {
            return (key.hashCode()) % numPartitions;
        }
    }
}

  

NULL值处理

NULL是一个特殊的分组key,所有key是null的tuple都会被聚集到一组里。

时间: 2024-12-06 18:56:35

Pig group用法举例的相关文章

Pig load 用法举例

users = load '/users.data' using PigStorage() as (name:chararray, age:int, address:chararray); load 'xx': 1)xx可以是文件,也可以是文件夹.如果是文件夹,则文件夹下的所有文件(包括子文件夹)都作为输入文件. 2)xx可以是匹配字符,参考Hadoop的globStatushttp://hadoop.apache.org/docs/current/api/org/apache/hadoop/f

Pig limit用法举例

lmt = limit data 10; 只获取指定条数的数据,不能保证每次得到的结果一致,先执行order再limit可以保证一致. 输入数据全部载入. 会触发reduce阶段 a = load 'a.txt'; b = group a all; c = foreach b generate COUNT(a) as sum; d = order a by $0; e = limit d c.sum/100;

Pig foreach用法举例

foreach:一行一行的遍历数据,处理一行的数据,然后返回一个tuple. users = load '/users.data';   1)别名引用 f = foreach users generate name, age;   2)位置引用 f = foreach users generate $0, $1; 3)字段区间 .. 从name字段开始到最后一个字段 f = foreach users generate name.. 从第一个字段开始到age字段 f = foreach user

Pig join用法举例

jnd = join a by f1, b by f2; join操作默认的是内连接,只有两边都匹配才会保留 需要用null补位的那边需要知道它的模式: 如果是左外连接,需要知道右边的数据集的模式,不匹配的字段用null补位 如果是右外连接,需要知道左边的数据集的模式,不匹配的字段用null补位 如果是全外连接,需要知道两边的数据集的模式,不匹配的字段用null补位 触发reduce阶段 基本用法 a = load 'input1'; b = load 'input2'; jnd = join

Pig sample用法举例

some = sample data 0.1 遍历整个数据集,获取指定比例的行数的数据,获取的数据不确定,条数也不准确. 内部重写为filter data by random() <= 0.1 抽取100行数据 data = load 'data'; grpd = group data all; sums = foreach grpd generate COUNT(data) as c; some = sample data 100/(double)sums.c;

Pig distinct用法举例

dst = distinct data: DISTINCT只能对整个记录(整行)去重,不能在字段级别去重. 触发reduce阶段 data = load 'data'; distinct data;

Pig filter用法举例

filter:过滤数据,只有符合特定条件的数据才会被保留下来,然后进入下一个数据流. 1)等值比较 filter data by $0 == 1 filter data by $0 != 1 2)字符串 正则匹配  JAVA的正则表达式 字符串以CM开头 filter data by $0 matches 'CM.*'; 字符串包含CM filter data by $0 matches '.*CM.*'; 3)not filter data by not $0==1; filter data

Pig store用法举例

store:将数据存储到HDFS等文件系统里 将数据保存到/data目录 store data into '/data'; 以逗号为分隔符 store data into '/data' using PigStorage(',');

聚集索引与非聚集索引的用法举例与使用注意

聚集索引 用法举例 小明需要查找一个人的姓名,知道他在公司的营销部门的1010办公室的4号座位.这个时候如果需要专门为小明建一个聚集索引表就是,以公司部门表内部门名称排序,再以房间总表序号排序,最后以房间详细表的座位表排序,这样就可以最快的找到他要找的人 聚集索引类似于一个字典,我们知道拼音来寻找字,首先我们知道字音节的首字母,从按a-z排序的字典中找到这个字首字母所在的区域,再从这个区域找到韵母所在的区域,当然韵母在字典中也有顺序,最后就可以找到我们想要的字了 注意事项 限制原则 每个表只能有