我使用hadoop 1.0.1来做一些项目,我想让我的input.txt文件成为我需要的“key”和“value”,比如:
如果我有 test.txt
文件和文件内容是
1, 10 10
我想我可以用“keyvaluetextinputformat”和make“,”作为分隔符号,所以输入后,键是“1”,值是“10”。
但是,我得到的结果是所有的信息都是关键的,值是空的。我不知道哪里出了问题。
请给我一些帮助,谢谢!
下面是示例代码:
public class WordCount{
public class WordCountMapper extends Mapper<Text, Text, Text, Text>{
public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
context.write(value, value);
context.write(key, key);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("key.value.separator.in.input.line",",");
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(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setInputFormatClass(KeyValueTextInputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
KeyValueTextInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
4条答案
按热度按时间disho6za1#
你使用的东西是正确的。
运行当前代码时,输出如下
为什么会这样是因为
您正在发射2个键值对。
第一个键值对是value value,第二个键值对是key key
哪个是正确的,值是10,键是1
anhgbhbe2#
我刚试过
KeyValueTextInputFormat
如果键和值之间有一个制表符,则会将整行作为键,而值中没有任何内容。所以我们必须使用
1 10,10
代替1, 10 10
li9yvcax3#
将输入文件转换为键值对,并为所有这些对调用map函数。现在在您的示例中,map的输入将是某个键(可能是1,因为它是文件中的行号),最重要的是您的值将是1,10。
现在,您可以从Map器输出任何内容,只有在交换和排序Map器的所有输出之后,这些内容才会转到reducer类的reduce函数。
所以,如果您从Map器输出context.write(值),从reducer输出相同的值,您将从所有文件中获得唯一的行。
我不认为我已经解释了你想要什么,但是这是hadoop map reduce中发生的基本事情。
t30tvxxf4#
可以在属性名称下指定分隔符
mapreduce.input.keyvaluelinerecordreader.key.value.separator
,默认分隔符是制表符('\t')
. 所以在你的情况下换线conf.set("key.value.separator.in.input.line",",");
至这应该可以解决问题