我正在使用具有不同数量的部分文件的递归目录结构。我想在这些文件上应用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解决方案,欢迎您,我也会尝试使用:) 如何使用Cascading CoGroup API? 请帮我解决这个问题,我试着在过去两周内解决这个问题。
提前致谢!
答案 0 :(得分:1)
在这里,我们可以通过使用级联中提供的简单混合连接来解决这个问题
http://docs.cascading.org/cascading/2.5/javadoc/cascading/pipe/joiner/MixedJoin.html
首先将每个输入路径连接到每个管道,合并管道与目录相关。
让合并输出管道我们得到dir1,dir2,dir3这将有文件
field1 field2 field3 field4 field5
并以dir []
创建这些管道的数组为每个管道创建每个管道的连接字段数组,用于每个管道 field1 field3 field4 field5
字段outputFields = new Fields(“field1”,“field2_dir1_files”,“field3”,“field4”,“field5”,“2field1”,“2field2_dir2_files”,“2field3”,“2field4”,“2field5”,“ 3field1" , “field2_dir3_files”, “3field3”, “3field4”, “3field5”);
boolean [] i = {false,false,false}
Pipe LastJoin = joinedPipe = new CoGroup(dir [],JoinFields [],new MixedJoin(outputFields,i);
需要管道=新保留(“field1”,“field2_dir1_files”,“field2_dir2_files”,“field2_dir3_files”,“field3”,“field4”,“field5”);
保留inoder以保留输出中所需的字段