hadoop-2.0.5-alpha
我在我的系统中配置了 Hadoop ( )。我能够运行字数统计示例。但是我无法理解LongWritbale
(作为 map 方法的第一个参数)的用途,如果我想做其他事情而不是字数统计(即不读取文件),那么我可以在这里传递什么。
(场景是:我想count
在一个 HDFS 目录中保留多少文件)?
首先,我建议您阅读一些关于 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();
并从你的映射器发出这个。你的 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);
}
}
这里的 LongWritable 是从用于运行作业的 inputformat 获得的密钥。默认情况下,使用文本输入格式,它将文件中的位置作为键返回,行作为值返回。
如果您的输入不是文件,您必须研究输入格式以了解它可能是什么。