hadoop 求平均值遇到带问题

本文探讨了使用Hadoop MapReduce实现平均值计算过程中遇到的问题,包括输出类型的设定及数值处理方式,作者尝试了不同的配置但未能成功运行程序。

具体程序就不写了,主要面对的问题有这么几个:

1.由于结果要输出打印,所以最后输出value的类型为Text,而非doubleWritable,但是wordcount为什么可以在输出时的类型设置为IntWritable?

这个应该是setoutputkeyclass和valueclass默认是map和reduce输出是一致的原因但是我改了还是不行,不知道为什么,难受啊。我还是把程序放上来吧。

这个程序是错的

public class average {
    public class AddMapper extends Mapper<LongWritable, Text, Text, Text> {
        Text word = new Text();

        public void map(LongWritable key, Text val, Mapper.Context context) throws IOException, InterruptedException {
            StringTokenizer st = new StringTokenizer(val.toString());
            while (st.hasMoreElements()) {
                word.set(st.nextToken());
                context.write(word, new Text(st.nextToken()));
            }
        }
    }

    public class AddReducer extends Reducer<Text, Text, Text, DoubleWritable> {
        DoubleWritable result = new DoubleWritable();

        public void reduce(Text key, Iterable<Text> vals, Mapper.Context context) throws IOException, InterruptedException {
            int s = 0;
            int length = 0;
            for (Text val : vals) {
                s += Integer.valueOf(val.toString());
                length++;
            }
            result.set((double) s*1.0 / length);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "average");
        job.setJarByClass(average.class);

        job.setMapperClass(AddMapper.class);
        job.setReducerClass(AddReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(DoubleWritable.class);

        FileInputFormat.addInputPath(job,new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

2.我写了个mapper输出键值对的value类型为intwritable,即用来保存求和的加数,在reduce函数中通过for循环来计算项数,这样再通过除法求平均值就是不能跑出结果,难道所有引入的数值必须是从mapper中得到的?不该吧,太玄幻了。

<think>好的,用户问的是“hadoop单词长度”,我需要先理解他的需Hadoop通常用于处理大规模数据,所以可能他需要的是统计每个单词的长度,或者计算所有单词的平均长度之类的。 首先,我得确认用户的具体需单词长度可能有不同的情况,比如统计每个单词的出现次数同时记录其长度,或者单纯统计每个单词的长度分布。比如,想知道不同长度的单词各有多少个,或者所有单词的平均长度等。 接下来,考虑在Hadoop中如何实现。Hadoop使用的是MapReduce模型,分为Map阶段和Reduce阶段。如果是统计每个单词的长度,可能需要将每个单词作为键,然后在reduce中计算长度。不过更可能的是用户想要统计不同长度单词的数量,比如长度为1的单词有多少个,长度为2的有多少,等等。 例如,在Map阶段,可以将每个单词转换为它的长度作为键,值设为1。然后在Reduce阶段,将相同长度的计数相加,得到每个长度对应的总次数。这样就能得到单词长度的分布情况。 需要编写Mapper和Reducer的代码。Mapper读取输入文本,分割成单词,然后对每个单词计算其长度,并发射(emit)长度和1。Reducer接收这些键值对,对每个长度和。 可能还需要考虑一些细节,比如去除标点符号,处理大小写,是否将单词转为小写,以及如何处理空字符串等。这些预处理步骤可能在Mapper中进行。 然后需要打包成JAR文件,提交到Hadoop集群运行。用户可能需要了解具体的代码示例,所以需要给出一个简单的例子,比如WordCount的变种,把单词替换为长度。 另外,可能用户对Hadoop的基本流程不熟悉,需要简要说明MapReduce的工作原理,以及各个阶段的任务。比如,输入分片、Map任务处理、Shuffle和Sort、Reduce任务汇总等。 还需要提到输入和输出的路径设置,以及如何查看结果。可能用户会遇到常见错误,比如正确设置输出目录,或者Mapper/Reducer的逻辑错误,可以提醒注意检查这些部分。 最后,可能需要扩展说明其他可能性,比如如果用户想要同时统计单词的出现次数和平均长度,应该如何调整程序结构,或者使用Combiner优化等。 总结一下,回答应该包括:需分析、MapReduce实现思路、代码示例、运行步骤以及注意事项。确保用户能够根据指导完成Hadoop任务的编写和执行。</think>在Hadoop中统计单词长度的典型场景是:**统计文本中不同长度单词的出现次数**(例如长度为2的单词出现100次,长度为3的单词出现200次)。以下是实现方案: --- ### 一、实现原理(MapReduce模型) 1. **Mapper阶段** - 输入:逐行读取文本数据 - 处理:将每个单词转换为长度,输出`(length, 1)` - 示例:`"Hello" → (5,1)` 2. **Reducer阶段** - 输入:接收`(length, [1,1,1...])` - 处理:对相同长度的计数和 - 示例:`(5, [1,1]) → (5,2)` --- ### 二、完整代码实现 #### 1. Mapper类 ```java public class WordLengthMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> { private final static IntWritable one = new IntWritable(1); private IntWritable length = new IntWritable(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); // 用正则表达式分割单词(过滤标点) String[] words = line.split("[^a-zA-Z']+"); for (String word : words) { if (!word.isEmpty()) { length.set(word.length()); context.write(length, one); // 输出 (单词长度, 1) } } } } ``` #### 2. Reducer类 ```java public class WordLengthReducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable> { public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); // 输出 (单词长度, 总次数) } } ``` --- ### 三、运行步骤 1. 打包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值