-4

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

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

4

2 回答 2

1

首先,我建议您阅读一些关于 MapReduce 的好帖子、书籍等。或者至少尝试用谷歌搜索它。你的问题表明你没有做任何研究,只是在这里发布了问题。你??

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

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

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

您可以传递任何 MR 类型,或者您的自定义类型(必须实现 Writable 和 Comparable)作为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);

  }

}
于 2013-09-18T14:06:08.477 回答
0

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

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

于 2013-09-18T13:23:42.130 回答