hashmap应该在一个reducer中使用

ergxz8rk  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(463)

在我的一个类中,我使用hashmap.im在Map器中调用那个类。所以现在每个Map器都有自己的hashmap。现在我可以将所有的hashmaps使用到一个reducer中吗?实际上,我的hashmap包含key作为文件名,value是set,所以每个hashmap都包含一个文件名和一个set。现在,我想使用包含相同文件名的所有hashmap,并希望合并所有值(集),然后将该hashmap写入我的hdfs文件

fumotvh3

fumotvh31#

是的,你能做到。如果Map器以hashmap的形式提供输出,那么可以使用hadoop的 MapWritable 作为你Map的价值。例如。

public class MyMapper extends Mapper<LongWritable, Text, Text, MapWritable>

你必须改变你的想法 Hashmap 进入 MapWritable 格式:

MapWritable mapWritable = new MapWritable();
for (Map.Entry<String,String> entry : yourHashMap.entrySet()) {
    if(null != entry.getKey() && null != entry.getValue()){
       mapWritable.put(new Text(entry.getKey()),new Text(entry.getValue()));
    }
}

然后为您的上下文提供可写Map:

ctx.write(new Text("my_key",mapWritable);

你上的减速机课 MapWritable 作为您的输入值

public class MyReducer extends Reducer<Text, MapWritable, Text, Text>

public void reduce(Text key, Iterable<MapWritable> values, Context ctx) throws IOException, InterruptedException

然后遍历Map并按所需方式提取值。例如:

for (MapWritable entry : values) {
  for (Entry<Writable, Writable> extractData: entry.entrySet()) {
      //your logic for the data will go here.
   }                    
}

相关问题