K1 和 K2 在 Mapper<K1、V1、K2> 字数统计中有什么用?



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

(场景是:我想count一个HDFS目录中保留了多少个文件)?

首先,

我建议您在MapReduce上浏览一些好文章,书籍等。或者至少尝试谷歌搜索一下。您的问题表明您没有做任何研究,只是在此处发布了问题。你有吗??

由于您是新手,这是第一次,我将尝试回答您的问题。但请以后尽量避免这种情况。

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

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

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

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

补遗:

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

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

并从您的映射器发出此内容。你的map()将是这样的:

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);
  }
}

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

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

相关内容

  • 没有找到相关文章