[HADOOP] 하둡 단어 개수 : 문자 "C"로 시작하는 단어의 수를받을
HADOOP하둡 단어 개수 : 문자 "C"로 시작하는 단어의 수를받을
Heres는 하둡 단어는 자바지도를 계산하고 소스 코드를 줄일 수 :
지도 기능, 난에 왔 어디에 출력 할 수있는 문자 "C"또한 그 단어가 나타납니다 총 횟수로 시작하지만, 난 할 노력하고있어 것은 바로 출력에게 총을 모든 단어를 하지만 문자 "C"로 시작하는 단어 나는 총 number.Any의 도움을 받고에 조금 주시면 감사하겠습니다 붙어있어, 감사합니다.
예
내가 갖는 것을 내 출력 :
수 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
}
}
해결법
-
==============================
1.크리스 Gerken의 대답은 권리입니다.
크리스 Gerken의 대답은 권리입니다.
당신이 당신의 열쇠로 말을하고 출력하기 경우 그것은 단지 당신이 "C"로 시작하는 독특한 단어의 수를 계산하는 데 도움이 될 것입니다
"C"의 모든 총 수입니다.
그에 대한 그래서 당신은 출력 매퍼에서 고유 키가 필요합니다.
while (itr.hasMoreTokens()) { String token = itr.nextToken(); if(token.startsWith("c")){ word.set("C_Count"); output.collect(word, one); } }
여기에 새로운 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); } } } }
감속기 클래스
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)); } }
-
==============================
2.대신에
대신에
output.collect(word, one);
당신의 매퍼에, 시도 :
output.collect("c-total", one);
-
==============================
3.매퍼에 대한 간단한 코드 :
매퍼에 대한 간단한 코드 :
public void map(LongWritable key, Text value,OutputCollector<Text,IntWritable> op, Reporter r)throws IOException { String s = value.toString(); for (String w : s.split("\\W+")) { if (w.length()>0) { if(w.startsWith("C")){ op.collect(new Text("C-Count"), new IntWritable(1)); } } } }
from https://stackoverflow.com/questions/26208454/hadoop-word-count-receive-the-total-number-of-words-that-start-with-the-letter by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브를 시작하지 못했습니다 (0) | 2019.10.09 |
---|---|
[HADOOP] 하이브 동적 분할을 지원 Sqoop을합니까? (0) | 2019.10.09 |
[HADOOP] java.lang.ClassNotFoundException가 : org.apache.hive.service.cli.HiveSQLException (0) | 2019.10.09 |
[HADOOP] 어떻게 맵리 듀스가 동시에 얼마나 많은 매퍼를 사용하여 말할? (0) | 2019.10.09 |
[HADOOP] 하둡에 InputFormat 사용자 정의 (0) | 2019.10.09 |