hadoop使用keyvaluetextinputformat

mwkjh3gx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(339)

我使用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);
      }
}
disho6za

disho6za1#

你使用的东西是正确的。
运行当前代码时,输出如下

10 10   10 10
1   1

为什么会这样是因为
您正在发射2个键值对。
第一个键值对是value value,第二个键值对是key key
哪个是正确的,值是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());
        }   
      }
anhgbhbe

anhgbhbe2#

我刚试过 KeyValueTextInputFormat 如果键和值之间有一个制表符,则会将整行作为键,而值中没有任何内容。
所以我们必须使用 1 10,10 代替 1, 10 10

li9yvcax

li9yvcax3#

将输入文件转换为键值对,并为所有这些对调用map函数。现在在您的示例中,map的输入将是某个键(可能是1,因为它是文件中的行号),最重要的是您的值将是1,10。
现在,您可以从Map器输出任何内容,只有在交换和排序Map器的所有输出之后,这些内容才会转到reducer类的reduce函数。
所以,如果您从Map器输出context.write(值),从reducer输出相同的值,您将从所有文件中获得唯一的行。
我不认为我已经解释了你想要什么,但是这是hadoop map reduce中发生的基本事情。

t30tvxxf

t30tvxxf4#

可以在属性名称下指定分隔符 mapreduce.input.keyvaluelinerecordreader.key.value.separator ,默认分隔符是制表符 ('\t') . 所以在你的情况下换线 conf.set("key.value.separator.in.input.line",",");

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

这应该可以解决问题

相关问题