hadoop - 如何使用Cascading的CoGroup

标签 hadoop mapreduce cascading

我的递归目录结构具有不同数量的零件文件。我想对这些文件应用 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

我想合并所有具有公共(public)值 field1field3field4field5 的部分文件。也就是说,最终输出文件将包含如下数据:

field1 field2_dir1_files field2_dir2_files field2_dir3_files field2_dir4_files field3 field4 field5

如果有任何 MapReduce 解决方案,非常欢迎您,我也会尝试 :)
使用 Cascading CoGroup API 怎么可能? 请帮我解决这个问题,我一直在努力解决过去两周的这个问题。

提前致谢!

最佳答案

这里我们可以通过使用级联中提供的简单混合连接来解决这个问题

http://docs.cascading.org/cascading/2.5/javadoc/cascading/pipe/joiner/MixedJoin.html

首先将每个输入路径连接到每个管道,并合并与目录相关的管道。

让合并输出管道我们得到 dir1,dir2,dir3 将有文件

字段1字段2字段3字段4字段5

并创建这些管道的数组作为 dir[]

为每个管道创建我们要连接的每个管道的连接字段数组 字段1 字段3 字段4 字段5

Fields 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 = joiningPipe = new CoGroup(dir[],JoinFields[],new MixedJoin(outputFields,i);

Pipe required = new Retain("field1","field2_dir1_files","field2_dir2_files","field2_dir3_files","field3","field4","field5");

retain inode 保留输出中需要的字段

关于hadoop - 如何使用Cascading的CoGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22472183/

相关文章:

hadoop - hdfs ls on directory 返回 No such file or directory 错误

java - MySQL导入数据到HDFS : ClassNotFoundException

hadoop - Hadoop Raw比较器

hadoop - 如何使用同一程序将MapReduce输出插入HBASE

java - 哈多普 : datanode not running?

hadoop - 无法在具有权限的文件夹中的HDFS上创建登台目录

java - MapReduce 上 Cassandra 执行错误

java - Gradle:由于缺少 jar,因此不会构建级联配置单元

Hadoop:级联 FlowException

java - 级联加入两个文件很慢