- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是 Hadoop 字数统计 java map 和 reduce 源代码:
在 map 函数中,我已经可以输出所有以字母“c”开头的单词以及该单词出现的总次数,但我想做的只是输出以字母“c”开头的单词总数,但我在获取总数时遇到了一些问题。非常感谢任何帮助,谢谢。
例子
我得到的输出:
可以 2
可以 3
类别 5
我想要得到的:
c-总计 10
public static class MapClass extends MapReduceBase
implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer itr = new StringTokenizer(line);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
if(word.toString().startsWith("c"){
output.collect(word, one);
}
}
}
}
public static class Reduce extends MapReduceBase
implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get(); //gets the sum of the words and add them together
}
output.collect(key, new IntWritable(sum)); //outputs the word and the number
}
}
最佳答案
Chris Gerken 的回答是正确的。
如果您输出单词作为键,它只会帮助您计算以“c”开头的唯一单词的数量
并非所有“c”的总数。
因此,您需要从映射器输出一个唯一的键。
while (itr.hasMoreTokens()) {
String token = itr.nextToken();
if(token.startsWith("c")){
word.set("C_Count");
output.collect(word, one);
}
}
这是一个使用 New Api 的例子
驱动类
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class WordCount {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "wordcount");
FileSystem fs = FileSystem.get(conf);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
if (fs.exists(new Path(args[1])))
fs.delete(new Path(args[1]), true);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setJarByClass(WordCount.class);
job.waitForCompletion(true);
}
}
映射器类
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer itr = new StringTokenizer(line);
while (itr.hasMoreTokens()) {
String token = itr.nextToken();
if(token.startsWith("c")){
word.set("C_Count");
context.write(word, one);
}
}
}
}
reducer 类
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text 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));
}
}
关于java - Hadoop 字数 : receive the total number of words that start with the letter "c",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26208454/
我正在为考试学习 C++,有一件事困扰着我。 我有一个包含 25 个单词的文件(我们称之为“new.txt”)和一个包含 1000 个单词的文件(“words.txt”)。 我必须检查 new.txt
我是一名 Python 新手,我正在做一些简单(但现在对我来说很复杂)的练习。我尝试了很多方法,但我决定停止猜测,因为我相信这不会是一个理智的学习例程。 我必须解决以下练习: Write a last
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
在我的数据库中,我有一个表,其中包含标题可以以字母或非字母字符开头的项目。例如数字或“@”或“#”。该模型如下所示: class Items(models.Model): title = mo
我有我的猜词游戏设置,这样当用户按下正确的字母时,相应的下划线就会被该字母替换。但是,我似乎无法多次填充同一个字母。示例:单词“Pennywise”有两个字母“n”,但是当按下该字母时,无论我按该字母
比方说,* 必须跟在 & 之后。例如, string asd = "Mother*&Mother*&Son"; // which is "Mother+ "*&" + "Mother" + "*&"
我试图通过一个接一个地添加字母来创建一个显示 QLabel(或 QTextEdit)内容的应用程序(就像应用程序是写他们)。 这是 python 中的示例: import os, time def w
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
在此示例中,我无法只定位第一个字母:http://jsfiddle.net/gB94x/ 显然“阅读更多”不应该也有首字下沉。 HTML 无法更改,它是固定模板的一部分。 谢谢! 最佳答案 .od_a
这个问题在这里已经有了答案: What does a space mean in a CSS selector? i.e. What is the difference between .class
什么是优雅的解决方案(即不向文本添加 ),当第一个单词是单个字母时,在首字母和第二个字母之间引入一个空格? 我正在尝试在段落的第一个字母上添加首字母大写。我遇到的问题是,如果第一个单词是 1 个字母
这是一个简单的问题,但它一直困扰着我和我的日志。 我有一个配置: akka { log-dead-letters-during-shutdown = off log-dead-letters
假设我有一个接受字符串输入的函数。 字符串输入如下所示:“first_time_run” 下面是我的代码 function changeInput (str) { // your code her
如果 td:nth-child(1) 的第一个字母不包含字母 D,所有想要的是隐藏 tr,如果它的所有 tds 不包含字母 D,atm 我的代码只是隐藏它。HTML: HTML
多年来我一直在尝试使用 Java 和 Regex 来研究这个问题,但确实很困难。我正在尝试创建一个符合这些条件的正则表达式: 单词只能包含字母和连字符 (-),并且必须以字母开头。没有数字。 我的 J
我用错误的字符串更新了 Name_Table.column_2 数据。我更新了 “JohnSmith”,而不是“John Smith”。 现在我想替换多个字符串,例如:'JohnSmith' as '
我正在尝试编写一段代码来执行以下操作: 将数字 0 到 9 分配给这个数字一个或多个字母。例如: 0 = N, 1 = L, 2 = T, 3 = D, 4 = R, 5 = V or F, 6 =
Love is a carefully designed lie. 爱情是一个精心设计的谎言 A friend without faults will never be found.&
题目地址: https://leetcode.com/contest/weekly-contest-105/problems/reverse-only-letters/ 题目描述 Given a
题目地址:https://leetcode.com/problems/shifting-letters/description/ 题目描述: Wehave a string S of lowerc
我是一名优秀的程序员,十分优秀!