CodeForge QQ客服 CodeForge 400电话 客服电话 4006316121
首页 » 源代码 » 基于hadoop的单词计数

基于hadoop的单词计数

zoro1209
发布于2016-10-17 16:23:54
源码作者
浏览次数:
下载次数:0
下载所需积分:1 
源码分类 Tags:
源码分类 所属分类:
hadoop wordcounthadoop wordcount AllAll

分享有礼! 》

  • 请点击右侧的分享按钮,把本代码分享到各社交媒体。
  • 通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
  • 通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。

代码介绍

package org.apache.hadoop;


import java.io.IOException;
import java.text.DecimalFormat;
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.Reducer;
import org.apache.hadoop.mapreduce.Reducer.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
import org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;


public class WordCount {


private static double sum = 0;


public static class FirstMapper extends
Mapper<Object, Text, Text, IntWritable> {


private final static IntWritable one = new IntWritable(1);
private Text word = new Text();// 用来暂存map输出中的key值,Text类型的


public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {


String strText = value.toString();
StringTokenizer itr = new StringTokenizer(strText);// 每行文本先转为字符
System.out.println("输出这一行文本:" + value.toString());
System.out.println("调用类map1方法");


while (itr.hasMoreTokens()) { // 遍历一下每行字符串中的单词
word.set(itr.nextToken()); // 出现一个单词就给它设成一个key并将其值设为1,这个key是reduce的key值
context.write(word, one); // 输出设成的key/value值,即<单词,1>的形式,并写入context中
// 上面就是map打散的过程
}
}
}


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


public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
// 经过底层排序,求和以后,这里一个字符见键对应多个整型值,一下要求整型值的和
int sum = 0;
System.out.println("调用类reduce1方法");
for (IntWritable value : values) {
sum += value.get();// 两种类型之间如何转换,get是序列化转基本
// 这里需要逐一将它们的value取出来予以相加,取得总的出现次数,即为汇和
}


result.set(sum); // 将values的和取得,并设成序列化对应的值
context.write(key, result);
// 此时的key即为map打散之后输出的key,没有变化,变化的时result,以前得到的是一个数字的集合,
// 已经给算出和了,并做为key/value输出。
}
}


public static class SecondMapper extends
Mapper<Object, Text, Text, DoubleWritable> {
@Override
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {


String line = value.toString();
StringTokenizer str = new StringTokenizer(line);
double num = 0;
String word = "";
while (str.hasMoreTokens()) {
word = str.nextToken();
num = Double.parseDouble(str.nextToken());
}
sum = sum + num;
context.write(new Text(word), new DoubleWritable(num));
}
}


public static class SecondReducer extends
Reducer<Text, DoubleWritable, Text, Text> {


private double rate = 0;


@Override
protected void reduce(Text key, Iterable<DoubleWritable> values,
Context context) throws IOException, InterruptedException {


double num = 0;
for (DoubleWritable value : values) {
if (value != null && value.get() > 0) {
num = value.get();
rate = num / sum;
System.out.println(key.toString() + ":" + value.get() + "/"
+ sum + "=" + rate);
}
}
DecimalFormat df = new DecimalFormat("0.0000 ");
rate = Double.parseDouble(df.format(rate));// 指定浮点型位数
String str = Integer.toString((int) num) + "\t"
+ Double.toString(rate);
context.write(key, new Text(str));
}
}


public static void main(String[] args) throws IOException {


Configuration conf = new Configuration();//Jobconf??


// 第一个job的配置
Job firstJob= new Job(conf, "join1");
firstJob.setJarByClass(WordCount.class);


firstJob.setMapperClass(FirstMapper.class);
firstJob.setReducerClass(FirstReducer.class);


firstJob.setMapOutputKeyClass(Text.class);// map阶段的输出的key
firstJob.setMapOutputValueClass(IntWritable.class);// map阶段的输出的value


firstJob.setOutputKeyClass(Text.class);// reduce阶段的输出的key
firstJob.setOutputValueClass(IntWritable.class);// reduce阶段的输出的value


// 加入控制容器
ControlledJob ctrljob1 = new ControlledJob(conf);
ctrljob1.setJob(firstJob);
// job1的输入输出文件路径
FileInputFormat.addInputPath(firstJob, new Path(args[0]));
FileOutputFormat.setOutputPath(firstJob, new Path(args[1]));


// 第二个job的配置
Job secondJob = new Job(conf, "Join2");
secondJob.setJarByClass(WordCount.class);


secondJob.setMapperClass(SecondMapper.class);
secondJob.setReducerClass(SecondReducer.class);


secondJob.setMapOutputKeyClass(Text.class);// map阶段的输出的key
secondJob.setMapOutputValueClass(DoubleWritable.class);// map阶段的输出的value


secondJob.setOutputKeyClass(Text.class);// reduce阶段的输出的key
secondJob.setOutputValueClass(Text.class);// reduce阶段的输出的value


// 作业2加入控制容器
ControlledJob ctrljob2 = new ControlledJob(conf);
ctrljob2.setJob(secondJob);


// 设置多个作业直接的依赖关系
// 如下所写:
// 意思为job2的启动,依赖于job1作业的完成


ctrljob2.addDependingJob(ctrljob1);


FileInputFormat.addInputPath(secondJob, new Path(args[1]));


FileOutputFormat.setOutputPath(secondJob, new Path(args[2]));


JobControl jobCtrl = new JobControl("myctrl");


// 添加到总的JobControl里,进行控制
jobCtrl.addJob(ctrljob1);
jobCtrl.addJob(ctrljob2);


Thread t = new Thread(jobCtrl);
t.start();


while (true) {
if (jobCtrl.allFinished()) {//打印成功作业的信息
System.out.println(jobCtrl.getSuccessfulJobList());
jobCtrl.stop();
break;
}
}
}


}

Ʋ

源码文件列表

温馨提示: 点击源码文件名可预览文件内容哦 ^_^
...
名称 大小 修改日期
Constants.java91.00 B07-10-16|13:40
MyMapper.java1.07 kB07-10-16|13:40
MyReducer.java750.00 B07-10-16|16:45
MyWordCount.java1.28 kB07-10-16|13:35
mapreduce0.00 B07-10-16|16:48
云测速

资源评论

(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
  • 1
  • 第1页
  • 共1页

基于hadoop的单词计数 (2.07 kB)

需要 1 积分
您持有 积分

CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了 了解更多

您的积分不足,优惠套餐快速获取 30 积分

订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。

更多付款方式:网银PayPal

上传代码,免费获取CodeForge积分

您本次下载所消耗的积分将转交上传作者。

同一源码,30天内重复下载,只扣除一次积分。

登录 CodeForge

还没有CodeForge账号? 立即注册
关注微博
联系客服

Switch to the English version?

Yes
CodeForge 英文版
No
CodeForge 中文版

完善个人资料,获价值¥30元积分奖励!

^_^"呃 ...

Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧
好的