如何使用新的Hadoop API使用MultipleTextOutputFormat?

#0

an easy way to to create key based output file names

 input data type

  //key        //value
 cupertino   apple
 sunnyvale   banana
 cupertino   pear

MultipleTextOutputFormat class

static class KeyBasedMultipleTextOutputForma extends MultipleTextOutputFormat<Text, Text> {
    @Override
    protected String generateFileNameForKeyValue(Text key, Text value, String name) {
        return key.toString() + "/" + name;
    }
} 

job config

 job.setOutputFormat(KeyBasedMultipleTextOutputFormat.class);

Run this code and you’ll see the following files in HDFS, where /output is the job output directory:

 $ hadoop fs -ls /output
 /output/cupertino/part-00000
 /output/sunnyvale/part-00000

hopes it helps.

#1

The docs say to use org.apache.hadoop.mapreduce.lib.output.MultipleOutputs instead.

Below is a snippet of code that uses MultipleOutputs. Unfortunately I didn't write it and haven't spent much time with it... So I don't know exactly why things are where. I share with the hopes it helps. :)

Job Setup

job.setJobName("Job Name");
job.setJarByClass(ETLManager.class);
job.setMapOutputKeyClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setMapOutputValueClass(MyThing.class);
job.setMapperClass(MyThingMapper.class);
job.setReducerClass(MyThingReducer.class);
MultipleOutputs.addNamedOutput(job, Constants.MyThing_NAMED_OUTPUT, TextOutputFormat.class, NullWritable.class, Text.class);
job.setInputFormatClass(MyInputFormat.class);
FileInputFormat.addInputPath(job, new Path(conf.get("input")));
FileOutputFormat.setOutputPath(job, new Path(String.format("%s/%s", conf.get("output"), Constants.MyThing_NAMED_OUTPUT)));

Reducer Setup

public class MyThingReducer extends
    Reducer<Text, MyThing, NullWritable, NullWritable> {
    private MultipleOutputs     m_multipleOutputs;

     @Override
    public void setup(Context context) {
        m_multipleOutputs = new MultipleOutputs(context);
    }
    @Override
    public void cleanup(Context context) throws IOException,
            InterruptedException {
        if (m_multipleOutputs != null) {
            m_multipleOutputs.close();
        }
    }

    @Override
    public void reduce(Text key, Iterable<MyThing> values, Context context)throws IOException, InterruptedException {
        for (MyThing myThing : values) {
            m_multipleOutputs.write(Constants.MyThing_NAMED_OUTPUT, EMPTY_KEY, generateData(context, myThing), generateFileName(context, myThing));
            context.progress();
        }
    }
}

EDIT: Added link to MultipleOutputs.

推荐文章

hook_menu()-意外行为(较长路径问题)

hook_menu()-意外行为(较长路径问题)

推荐文章

如何使用XPath来确认在传入的loadXML标记中是否找到表单元素?

如何使用XPath来确认在传入的loadXML标记中是否找到表单元素?

推荐文章

Regex删除div标记,但不删除其内容

Regex删除div标记,但不删除其内容

推荐文章

在UITextView中上下移动光标

在UITextView中上下移动光标

推荐文章

如何在当前的Eclipse透视图中激活Mylyn?

如何在当前的Eclipse透视图中激活Mylyn?

推荐文章

xcode和特别分发:我可以让xcode自动生成一个.ipa吗?

xcode和特别分发:我可以让xcode自动生成一个.ipa吗?

推荐文章

在PHP中数字前加空格

在PHP中数字前加空格

推荐文章

Rspec中的命令式和声明式步骤

Rspec中的命令式和声明式步骤

推荐文章

无法显示来自除我的主活动之外的活动的Toast

无法显示来自除我的主活动之外的活动的Toast

推荐文章

SQL Server查询以按订单查找所有产品的总价

SQL Server查询以按订单查找所有产品的总价

推荐文章

如何使用javascript中的计时器在GridView上自动分页

如何使用javascript中的计时器在GridView上自动分页

推荐文章

scala不再支持递归结构类型吗?

scala不再支持递归结构类型吗?

推荐文章

UITextField在文本末尾显示额外的点

UITextField在文本末尾显示额外的点

推荐文章

为什么使用var作为变量类型

为什么使用var作为变量类型

推荐文章

使用bundle获取图像列表

使用bundle获取图像列表

推荐文章

嵌入到许多文档中

嵌入到许多文档中