K1和K的用途是什么? Mapper中的K2 <k1,v1,k2,v2>在字数中?</k1,v1,k2,v2>

时间:2013-09-18 13:12:46

标签: java hadoop mapreduce

我在系统中配置了Hadoop(hadoop-2.0.5-alpha)。我能够运行Word计数示例。但是我无法理解LongWritbale的用法(作为map方法的第一个参数),如果我想做其他事情而不是字数(即不读取文件)那么我可以通过什么这里。

(场景是:我想count一个HDFS目录中有多少文件存在?)

2 个答案:

答案 0 :(得分:1)

首先,我建议你在MapReduce上阅读一些好的帖子,书籍等。或者至少尝试谷歌搜索它。您的问题表明您尚未进行任何研究,只是在此处发布问题。你有没有?

因为,你是新人,这是第一次,我会尝试回答你的问题。但请在将来尽量避免这种情况。

回到你的问题, LongWritbale IntWritbale 等是MapReduce类型,就像你在Java或任何其他语言中有int,long等。它在map方法中的用法与在任何普通方法或函数中使用数据类型相同,以告知该方法中使用的变量的类型。如果不指定变量,您如何知道变量的类型?简而言之,它代表类型的K1

如果我想做其他事情而不是字数统计(即不读取文件),那么我可以在这里传递什么。

您可以将任何MR类型或自定义类型(必须实现Writable和Comparable)作为 KEY 的类型传递。你是什​​么意思不读文件 ???

在文件/目录上启动MR作业后,您已经可以访问文件名,文件路径等内容,只是您应该知道如何使用它。

附录:

刚看到你的评论如下。如果您不想对文件内容执行任何操作,则无需担心输入键/值,即 K1,V1 。请勿触摸 K1 V1 。您应该担心的是输出键/值,即 K2,V2 。如果您只想从映射器中发出文件的路径和名称,则可以执行以下操作:

FileSplit fileSplit = (FileSplit)context.getInputSplit();
String fileName = fileSplit.getPath().getName();
String filePath = fileSplit.getPath().to String();

并从您的mapper中发出。你的地图()将是这样的:

public static class Your_Mapper extends
            Mapper<LongWritable, Text, Text, Text> {

Text path = new Text();
Text name = new Text();

public void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {

    FileSplit fileSplit = (FileSplit)context.getInputSplit();
    String fileName = fileSplit.getPath().getName();
    String filePath = fileSplit.getPath().to String();
    name.set(fileName);
    path.set(filePath);
    context.write(name, path);

  }

}

答案 1 :(得分:0)

这里的LongWritable是从用于运行作业的inputformat获得的密钥。默认情况下,使用文本输入格式,它将文件中的位置作为键返回,将行返回为值。

如果您的输入不是文件,您必须研究输入格式以了解它可能是什么。