birikin  

1. 继承MultipleTextOutputFormat实现自己的输出类。

2. 重写generateFileNameForKeyValue方法,返回输出的名字,可通过"/"分割表示目录路径。

3. 重写generateActualValue方法,返回真实的value。

4. 将类编译打包成jar,在运行streaming作业时设置-libjars YourJar.jar  -outputformat YourPackage.YourOutputClass选项


示例:

package joco;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

public class multiout extends MultipleTextOutputFormat<Text, Text> {

    @Override
    protected String generateFileNameForKeyValue(Text key, Text value, String name) {
        String v_f = value.toString();
        int pos = v_f.lastIndexOf('\t');
        return v_f.substring(pos+1, v_f.length())+"/"+name;
        
    }


    @Override
    protected Text generateActualValue(Text key, Text value) {
        String v_f = value.toString();
        
        int pos = v_f.lastIndexOf('\t');
        return new Text(v_f.substring(0, pos));
        
    }
}

mapreduce运行脚本:

#!/usr/bash
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming.jar  \
-libjars multiout.jar \
-outputformat joco.multiout \
-mapper map.py \
-reducer reduce.py \
-file map.py reduce.py \
-input /data/input \
-output /data/output

 

说明:将"\t"分割的reduce输出的最后一列作为输出文件名,其余部分作为key,value。

例如在reduce.py脚本中:

print "key1" + "\t" + "value1" + "\t" + "dir1"

print "key2" + "\t" + "value2" + "\t" + "dir2"

则输出路径为:

/data/output/dir1/part-00000,内容为key1 \t value1

/data/output/dir2/part-00000,内容为key2 \t value2

posted on 2016-03-18 15:24  joco  阅读(933)  评论(0)    收藏  举报