在 mapreduce 作业中对单独的行应用 wordcount
Apply wordcount on individual lines in a mapreduce job
我有一个像
这样的输入文件
LOW LOW HIGH LOW LOW
LOW HIGH MOD LOW LOW
HIGH LOW HIGH HIGH HIGH
LOW LOW LOW LOW LOW
. . . . .
. . . . .
我希望得到如下结果:
Genuine
Moderate
Not_genuine
Genuine
.
.
为此我需要解析一行并在每一行上应用 WordCount,然后根据编号。高或低的计数我会指定所需的结果。
通过使用 Stringtokenizer
所有行都被考虑在内并且 split method
没有到达行尾 (\n)
。无论如何我可以继续解决这个问题并获得所需的答案
为 MAPPER 完成的代码
这是我试图通过获取 \n
来修改的映射器函数
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
if(tokenizer.equals("\n")){
System.out.println("Line ends here");
Log log = LogFactory.getLog(getClass());
log.info("Line ends here");
}
word.set(tokenizer.nextToken());
context.write(word, one);
}
在您的映射器 class 中,您可以使用哈希集类型的机制来计算不同单词的逻辑。所以你不需要减速器。
假设使用 TextInputFormat,每个 map() 方法的输入 value
是单行。因此,在末尾有一个换行符是没有意义的。这就是为什么您在 log
.
中看不到任何消息的原因
正如 Karthik 所建议的,您不需要为此使用减速器。您所需要的只是汇总每个输入 value
(即行)的 'HIGH'、'LOW' 和 'MOD' 的数量并发出您的分类('Genuine'、'Moderate', 'Not-genuine') 直接来自映射器。
我认为问题出在您的输入文件上。
使用以下代码检查您的输入文件是否正确。
public static void main(String agr[]) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(
"yourfilelocation"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
之后你就可以在 Mapper 中编写计算不同单词的逻辑了。
希望对您有所帮助。
我有一个像
这样的输入文件LOW LOW HIGH LOW LOW
LOW HIGH MOD LOW LOW
HIGH LOW HIGH HIGH HIGH
LOW LOW LOW LOW LOW
. . . . .
. . . . .
我希望得到如下结果:
Genuine
Moderate
Not_genuine
Genuine
.
.
为此我需要解析一行并在每一行上应用 WordCount,然后根据编号。高或低的计数我会指定所需的结果。
通过使用 Stringtokenizer
所有行都被考虑在内并且 split method
没有到达行尾 (\n)
。无论如何我可以继续解决这个问题并获得所需的答案
为 MAPPER 完成的代码
这是我试图通过获取 \n
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
if(tokenizer.equals("\n")){
System.out.println("Line ends here");
Log log = LogFactory.getLog(getClass());
log.info("Line ends here");
}
word.set(tokenizer.nextToken());
context.write(word, one);
}
在您的映射器 class 中,您可以使用哈希集类型的机制来计算不同单词的逻辑。所以你不需要减速器。
假设使用 TextInputFormat,每个 map() 方法的输入 value
是单行。因此,在末尾有一个换行符是没有意义的。这就是为什么您在 log
.
正如 Karthik 所建议的,您不需要为此使用减速器。您所需要的只是汇总每个输入 value
(即行)的 'HIGH'、'LOW' 和 'MOD' 的数量并发出您的分类('Genuine'、'Moderate', 'Not-genuine') 直接来自映射器。
我认为问题出在您的输入文件上。
使用以下代码检查您的输入文件是否正确。
public static void main(String agr[]) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(
"yourfilelocation"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
之后你就可以在 Mapper 中编写计算不同单词的逻辑了。
希望对您有所帮助。