我在系统中配置了Hadoop(hadoop-2.0.5-alpha
)。我能够运行Word计数示例。但是我无法理解LongWritbale
的用法(作为map方法的第一个参数),如果我想做其他事情而不是字数(即不读取文件)那么我可以通过什么这里。
(场景是:我想count
一个HDFS目录中有多少文件存在?)
答案 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获得的密钥。默认情况下,使用文本输入格式,它将文件中的位置作为键返回,将行返回为值。
如果您的输入不是文件,您必须研究输入格式以了解它可能是什么。