Map / Reduce:完成后如何输出Hashmap?

莫扎特

我想实现DPC(通过快速搜索并找到密度峰值进行聚类)算法。这是一项艰巨的工作,因此我决定从Rho计算开始。

这里的地图:

 public void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {
            String line = value.toString();
            String[] lineSplit = line.split(" ");
            if (Double.parseDouble(lineSplit[2]) < dcThreshold) {
                IntWritable one = new IntWritable(
                        Integer.parseInt(lineSplit[0]));
                IntWritable two = new IntWritable(
                        Integer.parseInt(lineSplit[1]));
                context.write(one, two);
            }
        }

这里的减速器:

public void reduce(IntWritable key, IntWritable values, Context context)
                throws IOException, InterruptedException {
            int[] indexs = new int[2];
            indexs[0] = Integer.parseInt(key.toString());
            indexs[1] = Integer.parseInt(values.toString());
            for (int i = 0; i < indexs.length; i++) {
                densityCountMap.put(indexs[i],
                        densityCountMap.get(indexs[i]) + 1);
            }
        }

问题

densityCountMap是一个哈希图,仅在完成后才可以显示。如何输出densityCountMap?用什么方式?

- - - - -解决方案 - - - - -

多亏了mbaxi,您真正的启发了我,因为您提到了reduce定义不正确,并且密度计数图不是必需的。

我应该更清楚地表明,目标是如果lineSplit [2]低于某个阈值,则增加lineSplit [0]和lineSplit [1]。实际上,没有必要覆盖清除。

映射器:

public static class TokenizerMapper extends
        Mapper<LongWritable, Text, IntWritable, IntWritable> {
    private final static IntWritable count = new IntWritable(1);

    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        String[] lineSplit = line.split(" ");
        if (Double.parseDouble(lineSplit[2]) < dcThreshold) {
            IntWritable one = new IntWritable(
                    Integer.parseInt(lineSplit[0]));
            IntWritable two = new IntWritable(
                    Integer.parseInt(lineSplit[1]));
            context.write(one, count);// Both should be increased 
            context.write(two, count);// both as key
        }
    }
}

减速器:

public static class IntSumReducer extends
            Reducer<IntWritable, IntWritable, IntWritable, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(IntWritable key, Iterable<IntWritable> values,
                Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);//densityCountMap is redundant if having known better the structure of Map/reduce
            context.write(key, result);//it equals to output densityCountMap
        }
    }

再次感谢您,您带来的不仅仅是帮助,而是灵感。

mbaxi

您可以覆盖cleanup(Context上下文)方法,继续在reduce()方法中填充densityCountMap,并使用cleanup(Context上下文)方法将内容刷新/写入磁盘。

处理完所有行后,将调用cleanup()。

---根据评论部分的要求进行编辑---

如果使用的是Eclipse编辑器,请右键单击要扩展的Reducer类,然后单击Source-> Override / Implement Methods,否则可以查找Javadocs。

private static class RhoCalculationReducer extends Reducer<Text,Text,Text,Text> {
}

在那里,您将看到以下方法的列表[请注意,输入参数/数据类型可能会根据您的类定义而变化]-

cleanup(Context)
reduce(Text, Iterable<Text>, Context)
run(Context)
setup(Context)

您的reduce()或map()函数实际上是覆盖的实现,您在其中提供了自己的处理逻辑。对于map或reduce任务,可以认为setup()和cleanup()分别类似于构造函数或析构函数。在reduce任务的映射开始之前调用setup(),在任务结束时调用cleanup()。

我还看到您的化定义不正确,而不是“ IntWritable values ”,它应该是“ Iterable values ”。对于化器,请确保单个化器处理单个键的值,这就是为什么签名采用一个密钥并且可迭代值的列表。可能您还希望将单个键的记录聚合在一起,并且可能不需要额外的densityCountMap,因为reducer已经负责一次性获取给定键的所有值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

异步任务完成后Google Map Fragment更新/刷新

来自分类Dev

异步任务完成后,Google Map Fragment更新/刷新

来自分类Dev

Hadoop,成功完成Map Reduce作业,但没有输出

来自分类Dev

Rust期货`try_filter_map`引起恐慌:“异步fn在完成后恢复”

来自分类Dev

如何在hadoop map reduce中写avro输出?

来自分类Dev

完成MongoDB Map-Reduce中的步骤

来自分类Dev

完成MongoDB Map-Reduce中的步骤

来自分类Dev

无法打开 map-reduce 输出 url

来自分类Dev

如何运行并行进程并在完成后合并输出

来自分类Dev

过渡完成后如何更改文本?

来自分类Dev

Windows Service完成后如何停止?

来自分类Dev

$ digest完成后如何执行代码?

来自分类Dev

循环语句完成后如何循环?

来自分类Dev

完成后如何删除动画

来自分类Dev

音频完成后如何获得确认?

来自分类Dev

完成后如何打印ActionResult的结果

来自分类Dev

管道完成后如何获得值?

来自分类Dev

服务完成后如何禁用按钮?

来自分类Dev

spark reduce and map issue

来自分类Dev

$(...).. map(...)。reduce不是函数

来自分类Dev

RethinkDB Map / Reduce示例

来自分类Dev

Map-reduce 概念

来自分类Dev

从API Map / HashMap接收

来自分类Dev

MongoDB Map Reduce-完成以跳过一些结果

来自分类Dev

Scrapy Spider完成后重命名输出文件

来自分类Dev

了解Hadoop-Java Main()完成后的输出

来自分类Dev

完成后,grep qstat 输出和复制文件

来自分类Dev

如何修改Map-Reduce的执行顺序?

来自分类Dev

如何累计_.zip,_。map _.reduce操作?