Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java K1&;制图器中的K2<;K1、V1、K2、V2>;在字数方面?_Java_Hadoop_Mapreduce - Fatal编程技术网

Java K1&;制图器中的K2<;K1、V1、K2、V2>;在字数方面?

Java K1&;制图器中的K2<;K1、V1、K2、V2>;在字数方面?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我在系统中配置了Hadoop(Hadoop-2.0.5-alpha)。我能够运行单词计数示例。但我无法理解longwritebale(作为map方法的第一个参数)的用途,如果我想做其他事情而不是字数计算(即不读取文件),那么我可以在这里传递什么 (场景是:我想计算一个HDFS目录中保存了多少文件)?LongWritable这里是从用于运行作业的inputformat中获取的密钥。默认情况下,使用文本输入格式,将文件中的位置作为键返回,将行作为值返回 您必须研究inputformats,以了解如果

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


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

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


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

首先,我建议您浏览一些关于MapReduce的好文章、书籍等。或者至少试试谷歌搜索一下。你的问题表明你没有做任何研究,只是把问题贴在这里。你有吗

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

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

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

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

一旦你在一个文件/目录上启动了一个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);

  }

}
public静态类\u映射器扩展
制图员{
文本路径=新文本();
文本名称=新文本();
公共void映射(可长写键、文本值、上下文)
抛出IOException、InterruptedException{
FileSplit FileSplit=(FileSplit)context.getInputSplit();
字符串文件名=fileSplit.getPath().getName();
String filePath=fileSplit.getPath().to String();
name.set(文件名);
set(filePath);
write(名称、路径);
}
}

因为当我试图解决问题时,我只需要路径和文件(在其中),但它仍在读取文件内容。我如何避免它?“不读取文件”意味着每当我运行mapreduce时,它都在读取给定路径中存在的文件内容,这是我不想做的。键(LongWritable)是作为行的偏移量出现的,所以控件在映射器中出现的行数与文件中存在的行数一样多。这样,它会多次写入相同的记录。不要对K1和V1执行任何操作。你无法避免这些事情的产生。先生就是这样工作的。如果你不想使用它,你可以跳过它。是的,我没有用K1和V1做任何事情,但是我怎么能跳过它?跳过什么?你不能改变它的工作方式。如果你想跳过它,就不要碰它。