我有递归目录结构有不同数量的部分文件。我想在这些文件上应用cogroup。
假设我的目录结构如下:
directory1/dir1/part-0000
/part-0001
/part-0002
dir2/part-0000
/part-0001
/part-0002
dir3/part-0000
/part-0001
/part-0002
dir4/part-0000
/part-0001
/part-0002
这些零件文件包含制表符分隔的数据,如: field1 field2 field3 field4 field5
我要合并所有具有公共值的零件文件 field1
, field3
, field4
以及 field5
. 也就是说,最终输出文件将包含如下数据:
field1 field2_dir1_files field2_dir2_files field2_dir3_files field2_dir4_files field3 field4 field5
如果有任何mapreduce解决方案,我也会尝试:)
如何使用级联cogroupapi??请帮助我解决这个问题,我正在努力解决这个问题从过去两个星期。
提前谢谢!
1条答案
按热度按时间zbwhf8kr1#
在这里,我们可以通过使用级联中提供的简单混合联接来解决这个问题
http://docs.cascading.org/cascading/2.5/javadoc/cascading/pipe/joiner/mixedjoin.html
首先将每个输入路径连接到每个管道,然后合并与目录相关的管道。
让合并输出管道得到dir1,dir2,dir3,其中包含文件
字段1字段2字段3字段4字段5
并将这些管道的数组创建为dir[]
创建要连接的每个管道的连接字段数组,即每个管道的连接字段为field1 field3 field4 field5
fields outputfields=新字段(“field1”,“field2\u dir1\u files”,“field3”,“field4”,“field5”,“2field1”,“2field2\u dir2\u files”,“2field3”,“2field4”,“2field5”,“3field1”,“field2\u dir3\u files”,“3field3”,“3field4”,“3field5”);
布尔值[]i={false,false,false}
pipe lastjoin=joiningpipe=new cogroup(dir[],joinfields[],new mixedjoin(outputfields,i));
需要管道=新保留(“field1”,“field2\u dir1\u files”,“field2\u dir2\u files”,“field2\u dir3\u files”,“field3”,“field4”,“field5”);
retain inoder保留输出中所需的字段