我是hadoop的新手。并希望像map这样输入int到mapper:
1 2 3 4 ////// 6 7 8
3 3 2 1 ////// 5 9 0
===== //////// -----
键/////////值
键中的第四个和值中的下一个3个数字? 你能帮助我在mapper类的java中编写它吗?
我不想从文件中读取它。
答案 0 :(得分:0)
我不确定“不想从文件中读取”是什么意思。我想你需要做的是从文件中读取每一行并将每行分成'//////'。
public static class MapClass extends MapReduceBase implements
Mapper<LongWritable, Text, Text, Text> {
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line, "//////",
false);
word.set("key:"+tokenizer.nextToken());
output.collect(word, new Text("value="+tokenizer.nextToken()));
}
}
答案 1 :(得分:0)
如果你愿意,你可以在映射器之前从值中拆分键,我想这是一种更容易的方法来完成你想做的事情。可以使用KeyValueTextInputFormat作为输入类来完成。这正是你所需要的;它允许您选择分隔符/分隔符,该分隔符/分隔符将键与传递给映射器的值分开。您可以通过执行以下操作来设置:
job.setInputFormatClass(KeyValueTextInputFormat.class);
然后您可以通过输入以下内容来选择分隔符:
Configuration conf = new Configuration();
conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator","//////");
然后当它到达你的映射器时,它已经分裂了。