MapReduce统计以某字母开头的单词的平均长度

用MapReduce编写程序主要的就是编写Map和Reduce函数、main函数
java代码如下

package section1;import java.io.IOException;
import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
/***内容: 需求:对输入的文本中的单词求平均长度(单词里有多少个字符 就算 多长)*map输出时,判断单词的首字符是否是字母,如果不是,则不输出。*partition按照单词的首字母进行分区, 这样就可以得到26个分区*combine内求每个单词的次数和*定义26个reduce,reduce0只接收以字母a开头的单词,reduce1只接受以字母b开头的单词*reduce内求总长和总次数(每个单词的总长=该单词长度*该单词次数),总长=每个单词的总长和,总次数=每个单词的次数和*最后,reduce输出平均长度=总长/总次数*这样,得到了26个结果文件,每个文件里只有一个数,即以某字母开头的单词的平均长度*这样,这4个部分都需要编写不同的代码了*单词的首字母只按小写计算分区*
*/
public class mywordcount
{public static class MapClass extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();/*** 重载了默认的map方法,利用MapClass将每行字符串拆成单词,然后将输出结果<单词,1>写入到OutputCOllector中* OutputCollector由Hadoop框架提供,负责收集Map和Reduce的输出数据* 实现Map函数时,只要将输出<key,value>写入OutputCollector即可* map输入的value即为一行的字符串*/public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());//以空格作为分隔符while (itr.hasMoreTokens()) {String tmp = itr.nextToken();if(tmp.charAt(0)>='a' && tmp.charAt(0)<='z' || tmp.charAt(0) >='A' && tmp.charAt(0)<='Z'){word.set(tmp.toLowerCase());context.write(word, one);//把处理结果<单词,1>写入}}}}/**每一个数值代表一个分区,这样就有26个分区* * */public static class PartitionClass extends Partitioner<Text,IntWritable>{public int getPartition(Text key, IntWritable value, int numPartitions) {int result = 0;result = (key.charAt(0) - 'a') % numPartitions;return result;}}public static class CombinerClass extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();/*** 重载了默认的Reduce方法,通过key遍历其values<Iterator>, 并加以处理 * 所谓的处理就是将相同key下的词频相加,就可以得到这个单词的总的出现次数* reduce里key是任务的输出结果KEY,即表示一个单词,value即相同key下的数值*/public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {          sum += val.get();//对相同的单词数量进行累加}result.set(sum);context.write(key, result);//写输出结果}}public static class ReduceClass extends Reducer<Text,IntWritable,Text,DoubleWritable> {
//    private DoubleWritable result = new IntWritable();private int sumLength = 0;private int sumCount = 0;
//    private double avgLength = 0;private double avgLengthCharacter[] = new double[26];private int sameFirstCharacterCount[] = new int[26];private int sameFirstWordLengthCount[] = new int[26];public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int count = 0;int length = key.getLength();int index = 0;for (IntWritable val : values) {count++; //对相同的单词数量进行累加}index = key.charAt(0) - 'a';sameFirstCharacterCount[index] = sameFirstCharacterCount[index] + count;sameFirstWordLengthCount[index] = sameFirstWordLengthCount[index] + length*count;
//        sumLength += length * count;
//        sumCount += count;
//        context.write(key, new DoubleWritable(count));}/**     求整个文件中单词的平均长度*/protected void cleanup(Context context) throws IOException, InterruptedException {for (int index = 0;index < 26;index++)if (sameFirstCharacterCount[index] != 0){avgLengthCharacter[index] = (double)sameFirstWordLengthCount[index]/sameFirstCharacterCount[index];int outKey = 'a' + index;char outKeyChar = (char)outKey;String outKeyString = String.valueOf(outKeyChar);context.write(new Text(outKeyString), new DoubleWritable(avgLengthCharacter[index]));}}  }/**在 Hadoop 中一次计算任务称之为一个 job,可以通过一个Configuration对象设置如何运行这个job* @param args* @throws Exception*/public static void main(String[] args) throws Exception {Configuration conf = new Configuration();//启用默认设置,Configuration对象封装了客户端活服务器的配置String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job = new Job(conf, "word count");//定义一个作业控制job.setJarByClass(mywordcount.class);//设置执行类job.setNumReduceTasks(26);//定义26个reducejob.setMapperClass(MapClass.class);//指定map类型job.setCombinerClass(CombinerClass.class);//指定combiner类型job.setReducerClass(ReduceClass.class);//指定reduce类型job.setPartitionerClass(PartitionClass.class);//指定partition类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);//设置map函数的输出类型是Textjob.setOutputValueClass(DoubleWritable.class);//设置reduce函数的输出类型是IntWritable//定义输入数据的路径,通过Debug Configuration的Argument设置,该路径可以是单个文件,也可以是目录,此时将目录下所有文件当作输入或符合特定文件模式的一组文件FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//定义输出数据的路径,通过Debug Configuration的Argument设置,在运行任务前该目录不能存在,否则会报错FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//每次配置Job的最后一步,System.exit(0)代表正常退出,System.exit(1)代表不正常退出System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

MapReduce统计以某字母开头的单词的平均长度相关推荐

  1. 输入多个单词,统计以指定字母开头的单词个数

    本题目:先输入一个含有多个单词的字符串,然后再输入一个字母,然后调用函数getWordNum统计该行字符中以指定字母开始的单词的个数(不区分大小写).所谓"单词"是指连续不含空格的 ...

  2. 6-9 输入多个单词,统计以指定字母开头的单词个数 (10 分)

    本题目:先输入一个含有多个单词的字符串,然后再输入一个字母,然后调用函数getWordNum统计该行字符中以指定字母开始的单词的个数(不区分大小写).所谓"单词"是指连续不含空格的 ...

  3. python选取元音开头的单词_一学生易错词汇aan的选择元音字母开头的单词用an辅音字母...

    一:学生易错词汇 1. a, an 的选择 : 元音字母开头的单词用 an ,辅音字母开头的单词用 a. 2. am , is , are 的选择 : 单数用 is , 复数用 are. I 用 am ...

  4. Python——找出以元音字母开头的单词

    Python--找出以元音字母开头的单词 从键盘键入5个英文单词,输出以元音字母开头的单词. 思路: 1.一次输入5个单词,以空格分隔,作为一个字符串: 2.用字符串的split()函数将字符串转换为 ...

  5. python作业——输出以元音字母开头的单词(字符串列表操作)

    输出以元音字母(含大小写)开头的单词,需求如下: 运行结果截图: 代码实现如下: lst = "aeiouAEIOU" print('学号:*** 姓名:***') lisinpu ...

  6. 统计文件中以某个字母开头的单词的数目

    版权声明:本文系作者原创.未经许可,不得转载. 文件名为:try.txt $ cat try.txtThe Younger Generation In the Twenty-first Century ...

  7. python中从键盘输入五个单词输出以元音字母开头的单词_Python程序设计入门——第五周作业...

    这里记录在网易云课堂上的课后作业,Python环境为2.7,如果您有更好的算法还望斧正! 1.题目内容: "Pig Latin"是一个英语儿童文字改写游戏,整个游戏遵从下述规则: ...

  8. 从键盘输入5个英文单词,输出其中以元音字母开头的单词

    a = [] for i in range(5):b = input('请输入第' + str(i + 1) + '个单词:')if b[0].lower() in ['a', 'i', 'o', ' ...

  9. python输出以元音字母开头的单词_开头是元音字母的英语单词有哪些?

    展开全部 1.前元音[i:],[I],[e],[æ]的发音特点 A.舌尖抵住下齿. B.舌前部向硬颚抬e5a48de588b662616964757a686964616f31333365643539起 ...

  10. 数组指针应用(输入字母 查找以此字母开头的单词)

    #include<stdio.h> int main() {char* ch[5]={"red","yellow","green" ...

最新文章

  1. Java中读取某个目录下的所有文件和文件夹
  2. [名词解释] RIAD磁盘阵列
  3. 明抢华为市场,宣战苹果三星,这家创业公司胆子不小
  4. 前端开发工具包-WijmoJS,部署授权详解
  5. 30天python从入门到精通_2019最新《Python从入门到精通之30天快速学Python教程 》
  6. kvm启动报错Could not access KVM kernel module: Permission denied
  7. 苹果CMSv10_全站伪静态规则教程_宝塔Linux系统
  8. python—多进程的消息队列
  9. 这就是XcodeGhost作者的原话
  10. C/C++语言IDE_开发工具
  11. 用GetData软件自动读取图中的数据
  12. 对偶理论与灵敏度分析
  13. bat怎么发起网络请求_批处理命令教程之网络入侵
  14. java eml 附件_Javamail怎样写带附件eml文件?
  15. PolSAR处理极化SAR
  16. 文学类的小说,言情类的,没有排行榜上的
  17. js iframe 打印 打印预览 页眉页脚的设置
  18. dns找不到服务器,“找不到服务器或DNS错误”,如何调整?
  19. jini surrogate架构
  20. fstab 与移动硬盘挂载方法

热门文章

  1. 阳春三月,放飞希望---希望今年不再碌碌无为
  2. 视频大数据与物联网(IoT)融合发展的探索
  3. android 利用shape做控件背景(小圆点,空心带边框背景)
  4. 第12课:(2)线性回归建模实验
  5. Google IO 2022——CSS 状态
  6. Eclipse配色学习
  7. ca 手机抓包_抓包安卓7以上ca证书安装方法
  8. UOJ 30 【CF Round #278】Tourists
  9. 微信小程序——实现下拉框
  10. Linux Test Project(LTP项目)