Mapper中的多输入文件夹位置

时间:2016-08-05 13:46:09

标签: hadoop mapreduce hadoop2

是否有可能以任何方式在Driver类中提供多个输入文件夹位置?

我有4个输入文件夹位置,在这种情况下我们如何在我的驱动程序类中指定所有4个文件夹位置,以便我的映射器可以从这4个不同文件夹中的所有文件中读取数据。

非常感谢...

2 个答案:

答案 0 :(得分:0)

您可以使用MultipleInputs类添加输入文件。

MultipleInputs.addInputPath(job, inputPath, TextInputFormat.class, MyMapper.class);

您可以将上述inputPath替换为您的文件位置,将TextInputFormat.class替换为输入文件格式,将MyMapper.class替换为mapper类。

这样您就可以根据需要添加任意数量的文件。

答案 1 :(得分:0)

如果这4个位置的数据不同,那么您可能需要考虑创建4个不同的映射器类来读取它们。您的代码看起来类似于下面的示例。在执行时,将您的位置作为参数传递给序列广口瓶中。

public class MultiplePaths {

public static void main(String[] args) throws Exception {

    JobConf conf = new JobConf(MultiplePaths.class);
    conf.setJobName("MultipleMappersPaths");

    conf.setMapOutputKeyClass(Text.class);
    conf.setMapOutputValueClass(Text.class);

    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(Text.class);

    MultipleInputs.addInputPath(conf,new Path(args[0]),TextInputFormat.class,LocationMapper1.class);
    MultipleInputs.addInputPath(conf,new Path(args[1]),TextInputFormat.class,LocationMapper2.class);
    MultipleInputs.addInputPath(conf,new Path(args[2]),TextInputFormat.class,LocationMapper3.class);
    MultipleInputs.addInputPath(conf,new Path(args[3]),TextInputFormat.class,LocationMapper4.class);

    FileOutputFormat.setOutputPath(conf, new Path(args[2]));
    JobClient.runJob(conf);

  }

} 

否则,如果你必须从4个不同的位置读取类似的文件,你的代码应该类似于下面的例子。在执行jar时按顺序将你的位置作为参数传递。

MultipleInputs.addInputPath(conf,new Path(args[0]),TextInputFormat.class,LocationMapper.class);
    MultipleInputs.addInputPath(conf,new Path(args[1]),TextInputFormat.class,LocationMapper.class);
    MultipleInputs.addInputPath(conf,new Path(args[2]),TextInputFormat.class,LocationMapper.class);
    MultipleInputs.addInputPath(conf,new Path(args[3]),TextInputFormat.class,LocationMapper.class);