8

我使用 hadoop 1.0.1 做一些项目,我想让我的输入 .txt 文件成为我需要的“键”和“值”,比如:

如果我有一个test.txt文件并且文件内容是

1, 10 10

我想我可以使用 "KeyValueTextInputFormat" 并让 "," 成为分隔符,所以输入后,"1""10 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

4 回答 4

1

分隔符可以在属性名下指定mapreduce.input.keyvaluelinerecordreader.key.value.separator,默认分隔符是制表符('\t')。因此,在您的情况下,将行更改conf.set("key.value.separator.in.input.line",",");

conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator",",");

这应该可以解决问题

于 2014-05-28T08:57:14.127 回答
0

你正确地使用了这些东西。

链接 在运行当前代码时,输​​出就像

 10 10   10 10
1   1

为什么会这样是因为

您正在发出 2 个键值对。

第一个键值对是值值 ,第二个键值对是键键

这是正确的一个 值是10,键是1

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("key", key);              //prints key as 1
            context.write("value", value);          //prints value as 10 10
            System.out.println(key.toString());
            System.out.println(value.toString());
        }   
      }
于 2014-09-29T09:51:34.657 回答
0

我刚刚尝试过,KeyValueTextInputFormat如果它们之间有一个选项卡,则采用键和值,否则它将把整行作为键,并且没有任何价值。

所以我们必须1 10,10使用1, 10 10

于 2014-01-25T09:37:52.007 回答
-1

输入文件被转换为键值对,并且将为所有这些对调用 map 函数。现在,在您的示例中,map 的输入将是某个键(可能是 1,因为它是文件中的行号),最重要的是您的值将是 1,10 10。

现在,您可以从映射器输出任何内容,只有在交换和排序映射器的所有输出后,才会进入减速器类的 reduce 函数。

因此,如果您从映射器输出 context.write(value) 并从减速器输出相同的内容,您将从所有文件中获得唯一的行。

我想我没有解释你想要什么,但这是 Hadoop Map-Reduce 中发生的基本事情。

于 2012-09-24T12:12:17.570 回答