pig的cogroup详解

COGROUP与join的区别:自己懒得写,摘自网络

Join的操作结果是平面的(一组元组),而COGROUP的结果是有嵌套结构的。

运行以下命令:

r1 = cogroup r_student by classNo,r_teacher by classNo;

dump r1;

结果如下:

(C01,{(C01,N0103,65),(C01,N0102,59),(C01,N0101,82)},{(C01,Zhang)})

(C02,{(C02,N0203,79),(C02,N0202,82),(C02,N0201,81)},{(C02,Sun)})

(C03,{(C03,N0306,72),(C03,N0302,92),(C03,N0301,56)},{(C03,Wang)})

(C04,{},{(C04,Dong)})

由结果可以看出:

1)  cogroup和join操作类似。

2)  生成的关系有3个字段。第一个字段为连接字段;第二个字段是一个包,值为关系1中的满足匹配关系的所有元组;第三个字段也是一个包,值为关系2中的满足匹配关系的所有元组。

3)  类似于Join的外连接。比如结果中的第四个记录,第二个字段值为空包,因为关系1中没有满足条件的记录。实际上第一条语句和以下语句等同:

r1= cogroup r_student by classNo outer,r_teacher by classNo outer;

如果你希望关系1或2中没有匹配记录时不在结果中出现,则可以分别在关系中使用inner而关键字进行排除。

执行以下语句:

r1 = cogroup r_student by classNo inner,r_teacher byclassNo outer;

dump r1;

结果为:

(C01,{(C01,N0103,65),(C01,N0102,59),(C01,N0101,82)},{(C01,Zhang)})

(C02,{(C02,N0203,79),(C02,N0202,82),(C02,N0201,81)},{(C02,Sun)})

(C03,{(C03,N0306,72),(C03,N0302,92),(C03,N0301,56)},{(C03,Wang)})

flatten执行命令:

r2 = foreach r1 generate flatten($1),flatten($2);

dump r2;

结果如下:

(C01,N0103,65,C01,Zhang)

(C01,N0102,59,C01,Zhang)

(C01,N0101,82,C01,Zhang)

(C02,N0203,79,C02,Sun)

(C02,N0202,82,C02,Sun)

(C02,N0201,81,C02,Sun)

(C03,N0306,72,C03,Wang)

(C03,N0302,92,C03,Wang)

(C03,N0301,56,C03,Wang)

可以看到,两个同时flatten,会自动映射生成多列。

针对cogroup,我测试了一下,核心代码如下:

industry_existed_Data =  LOAD ‘$industryPath‘ USING PigStorage(‘,‘) AS (industryId:chararray,guid:chararray,sex:chararray,log_type:chararray);

sample_data = limit industry_existed_Data 20;

--STORE  sample_data INTO ‘/user/wizad/tmp/industry_existed_Data‘ USING PigStorage(‘,‘);

--merge with history data

cogroupIndustryExistCurrentByGuid = COGROUP industry_existed_Data by guid, industry_current_data by guid;

mydata = sample cogroupIndustryExistCurrentByGuid 0.1;

dump mydata;

describe cogroupIndustryExistCurrentByGuid;

--dump cogroupIndustryExistCurrentByGuid;

--STORE  mycogroupdata INTO ‘/user/wizad/tmp/cogroupIndustryExistCurrentByGuid‘ USING PigStorage(‘,‘);

look_for_cogroup = FOREACH cogroupIndustryExistCurrentByGuid GENERATE $0,$2;

describe look_for_cogroup;

IndustryStorageDataTmp = FOREACH cogroupIndustryExistCurrentByGuid GENERATE FLATTEN($2);

IndustryStorageData = DISTINCT IndustryStorageDataTmp;

describe IndustryStorageData;

显示结果:

三个数据的结构如下

cogroupIndustryExistCurrentByGuid:

{

group: chararray,

industry_existed_Data:{industryId: chararray,guid: chararray,sex: chararray,log_type: chararray},

industry_current_data: {joined_ad_campaign_data::industryId: chararray,joined_Orgin_sex_data::distinct_origin_historical_sex::guid: chararray,joined_Orgin_sex_data::social_sex::sex: chararray,joined_Orgin_sex_data::distinct_origin_historical_sex::log_type:
chararray}

}

look_for_cogroup:

{

group: chararray,

industry_current_data: {joined_ad_campaign_data::industryId: chararray,joined_Orgin_sex_data::distinct_origin_historical_sex::guid: chararray,joined_Orgin_sex_data::social_sex::sex: chararray,joined_Orgin_sex_data::distinct_origin_historical_sex::log_type:
chararray}

}

IndustryStorageData:

{

industry_current_data::joined_ad_campaign_data::industryId: chararray,

industry_current_data::joined_Orgin_sex_data::distinct_origin_historical_sex::guid: chararray,

industry_current_data::joined_Orgin_sex_data::social_sex::sex: chararray,

industry_current_data::joined_Orgin_sex_data::distinct_origin_historical_sex::log_type: chararray

}

可以看出三个数据的结构很复杂,因为前面做关联所以包含了对象名(或者叫域名),指明属于哪个对象。可以只看最后一列名字和格式。

第三个是flatten($2)的结果。

cogroup有空集问题,就是对应group中的每个值(cogroup用来关联的key的取值),两个集合各自按key值进行group后,某些key对应的集合为空。

上面的pig代码的实际数据如下,guid作为关联key,可以看出很多空集{},出现在某些guid的取值对应集合后。

所以取数据时要注意,只flatten某一列,会造成其他列数据丢失,因为对应着该flatten列的空集。

((-1,),{(74,9051235c-a391-4dae-ab22-f93d24a12636,-1,-1,),(75,053e9f48-03bf-4b39-9455-ff412a725a3c,-1,-1,),(74,21ca723c-ec2b-4242-8108-b95436f10e3e,-1,-1,),(74,fec1932a-b0e4-4bf0-b504-8ed8f3c159e7,-1,-1,),(74,d74374ec-8cf4-4c4a-b598-9631f6972cbb,-1,-1,),(74,6780962a-bf75-4c4c-a557-94a7de5a3e36,-1,-1,),(74,14517915-ee3f-4d34-943f-d6f1813afdef,-1,-1,),(74,c5547aca-3b8b-4108-93ba-bf365c106cdd,-1,-1,),(74,e9a986c1-6868-4f7f-baf6-69d8c302583e,-1,-1,),(74,9c1341cf-45b8-48c6-b699-33b1a4215c66,-1,-1,),(74,f16e6222-a84b-4758-ae71-0613c8f34b29,-1,-1,),(74,47cc25ef-05bc-47f4-a32b-3cddaf0ac22b,-1,-1,),(74,d5c1b6b0-38c3-464b-8cb9-70ced875be5f,-1,-1,),(74,6a4f782a-1f5c-45c0-bb3a-4df25c436be3,-1,-1,),(74,23bb2f0c-d629-479d-800e-b86fc3d6e45c,-1,-1,)})

((a50a17bde79ac018,),{(74,863010025134441,a50a17bde79ac018,863010025134441,)})

((a51779f736cd3f54,),{(74,862949029595753,a51779f736cd3f54,862949029595753,)})

((c7ae5867-3b77-4987-b082-ed3867b5c384,),{(74,353627055387065,c7ae5867-3b77-4987-b082-ed3867b5c384,353627055387065,)})

时间: 2024-10-15 16:49:05

pig的cogroup详解的相关文章

spark2.x由浅入深深到底系列六之RDD java api详解四

学习spark任何的知识点之前,先对spark要有一个正确的理解,可以参考:正确理解spark 本文对join相关的api做了一个解释 SparkConf conf = new SparkConf().setAppName("appName").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaPairRDD<Integer, Integer> javaPa

详解mysql中的Using与On的用法

多用才可以体会各个关键字的用法啊... 原文来自[http://bbs.php100.com/read-htm-tid-148469.html] 在用Join进行多表联合查询时,我们通常使用On来建立两个表的关系.其实还有一个更方便的关键字,那就是Using.那么这两个关键字在使用上有啥区别呢?往下看.假设有如下两张表:    mysql> select * from pets; +---------+---------+--------+-----------+ | pets_id | ani

【Hibernate步步为营】--继承映射详解

上篇文章讨论了多对多映射,在使用多对多映射时重点是使用<many-to-many>标签,并在标签的两端加入外键这样在生成关系时会创建两个关系之间的关系表,通过关系表来维护它们之间的关系,另外对于单向和双向的区别是在映射的哪一端添加标签的问题.在面向对象中很重要的一个特性就是继承,继承实现了代码的复用,而且Hibernate把基本上所有的对象模型进行了映射封装,其中就包括继承映射,接下来就详细讨论. 一.继承映射 继承是面向对象很重要的特性,它实现了代码的服用,在关系模型中同样也有继承关系,这种

javascript原型详解

1.原型基本特征: ps:1.原型类型与其他语言的一个类,所定义的属性,方法可以被此类产生的所有对象所共享 2.修改原型的属性或者方法,会立即生效,其派生的子类的属性,方法也将改变 例子1: function Mytest(){ } Mytest.prototype.name="jerry"; var test1=new Mytest(); alert(test1.name);//jerry Mytest.prototype.name="jack"; var tes

GCC参数详解

[介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 2.将预处理后的文件不转换成汇编语言,生成文件.s 3.有汇编变为目标代码(机器代码)生成.o的文件 4.连接目标代码,生成可执行程序 [参数详解] -x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp. 可以使用的参数有下面的这些:

scons用户指南翻译(附gcc/g++参数详解)

scons用户指南 翻译 http://blog.csdn.net/andyelvis/article/category/948141 官网文档 http://www.scons.org/documentation.php ===================================== UNIX系统开发-gcc参数详解 [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2

[转]Mahout推荐算法API详解

Mahout推荐算法API详解 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等. 从2011年开始,中国进入大数据风起云涌的时代,以Hadoop为代表的家族软件,占

Hue的全局配置文件hue.ini(图文详解)

Hue版本:hue-3.9.0-cdh5.5.4 需要编译才能使用(联网) 说给大家的话:大家电脑的配置好的话,一定要安装cloudera manager.毕竟是一家人的.同时,我也亲身经历过,会有部分组件版本出现问题安装起来要个大半天时间去排除,做好心里准备.废话不多说,因为我目前读研,自己笔记本电脑最大8G,只能玩手动来练手.纯粹是为了给身边没高配且条件有限的学生党看的! 但我已经在实验室机器群里搭建好cloudera manager 以及 ambari都有. 大数据领域两大最主流集群管理工

java类和对象详解

对象和类详解 什么是对象:万物皆对象,什么东西都是对象,例如,猫狗人 什么是类:类是同一事物的统称,它描述一类对象的行为和状态. 设计类:抽象过程 类的属性 类的方法 什么是实例化:由类得到对象这个过程叫做实例化 对象和类的区别:一个是抽象一个是具体,一个是集合一个是个体等等.一个是魔板一个是实例,一个是数据一个是数据结构等等. 如何设计类:public class student{}//把类的共同提出提取出来, 学生会有什么:名字,年龄,性别,等等,这就是共同特征. //共同特征为类的属性,共