import org.apache.hadoop.io.Text;

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.ContextFactory;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MapFileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Progressable;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class MultiFileOut extends Configured implements Tool {
    private final static String[] Shengarry = { "北京", "天津", "山西", "内蒙古", "辽宁",
            "吉林", "黑龙江", "上海", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北",
            "湖南", "广东", "广西", "海南", "重庆", "四川", "贵州", "云南", "西藏", "陕西省", "甘肃",
            "青海", "宁夏", "新疆", "河北" };
    private final static String[] sexary = { "M", "F" };

public static String getPinYin(String src) {
        char[] srcary = null;
        srcary = src.toCharArray();
        String[] strtmp = new String[srcary.length];

// 设置汉字拼音输出的格式
        HanyuPinyinOutputFormat formatstr = new HanyuPinyinOutputFormat();
        formatstr.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        formatstr.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        formatstr.setVCharType(HanyuPinyinVCharType.WITH_V);
        String resultstr = "";
        int t0 = srcary.length;
        try {
            for (int i = 0; i < t0; i++) {
                // 判断能否为汉字字符
                if (Character.toString(srcary[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    strtmp = PinyinHelper.toHanyuPinyinStringArray(srcary[i],
                            formatstr);// 将汉字的几种全拼都存到t2数组中
                    resultstr += strtmp[0];// +" ";// 取出该汉字全拼的第一种读音并连接到字符串t4后
                } else {
                    // 如果不是汉字字符,间接取出字符并连接到字符串t4后
                    resultstr += Character.toString(srcary[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            e.printStackTrace();
        }
        return resultstr;
    }

private static class ProvinceMapper extends
            Mapper<Object, Text, Text, Text> {
        @Override
        protected void map(Object key, Text value, Context context)
                throws IOException, InterruptedException {
            String str = value.toString();
            String outkey = "";
            Boolean isfind = false;
            if (str.indexOf("name") >= 0)
                return;

String[] strArray = str.split(",");
            if (strArray.length != 33)
                return;

String sex = strArray[5];
            String addr = strArray[7];
            for (int i = 0; i < Shengarry.length; i++) {
                for (int j = 0; j < sexary.length; j++) {
                    int index = addr.indexOf(Shengarry[i]);
                    if ((index >= 0) && (index <= 3)
                            && (sex.indexOf(sexary[j]) >= 0)) {
                        isfind = true;
                        outkey = getPinYin(Shengarry[i]) + sexary[j];
                        break;
                    }
                }

if (isfind)
                    break;
            }

if (isfind) {
                context.write(new Text(outkey), value);
            } else {
                System.out.println("Error Data" + value.toString());
            }
        }
    }

private static class ProvinceReducer extends
            Reducer<Text, Text, NullWritable, Text> {
        private MultipleOutputs mos = null;

@Override
        protected void setup(Context context) throws IOException,
                InterruptedException {
            mos = new MultipleOutputs(context);
        }

@Override
        protected void cleanup(Context context) throws IOException,
                InterruptedException {
            mos.close();
        }

@Override
        protected void reduce(Text key, Iterable<Text> values, Context context)
                throws IOException, InterruptedException {
            Text value = new Text("");
            String valuetmp = "";

for (Text va : values) {
                value.set(va.toString());
                
                try {
                    mos.write(key.toString(), NullWritable.get(), value);
                } catch (Exception e) {
                    //System.out.println("Exception" + key);
                }
            }
        }
    }

public static void main(String[] args) throws Exception {
        ToolRunner.run(new Configuration(), new MultiFileOut(), args);
    }

@Override
    public int run(String[] args) throws Exception {
        int result = 0;
        Configuration conf = new Configuration();
        String[] argArray = new GenericOptionsParser(conf, args)
                .getRemainingArgs();
        if (argArray.length != 2) {
            System.err.println("Usage: MultiFileOut <in> <out>");
            System.exit(1);
        }

Job job = new Job(conf, "MultiFileOut");
        job.setJarByClass(MultiFileOut.class);
        job.setMapperClass(ProvinceMapper.class);
        job.setReducerClass(ProvinceReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);
        job.setOutputKeyClass(NullWritable.class);
        job.setOutputValueClass(Text.class);
        // job.setOutputFormatClass(WordCountOutputFormat.class);
        FileInputFormat.addInputPath(job, new Path(argArray[0]));
        FileOutputFormat.setOutputPath(job, new Path(argArray[1]));
        
        for (int i = 0; i < Shengarry.length; i++) {
            for (int j = 0; j < sexary.length; j++) {
                MultipleOutputs.addNamedOutput(job, getPinYin(Shengarry[i])
                        + sexary[j], TextOutputFormat.class, Text.class,
                        Text.class);
            }
        }
        
        try {
            result = job.waitForCompletion(true) ? 0 : 1;
        } catch (ClassNotFoundException | InterruptedException e) {
            e.printStackTrace();
        }

return result;
    }
}

hadoop分类输出的更多相关文章

  1. mysql 如何在访问某张数据表按照某个字段分类输出

    也许大家有时候会遇到需要将把数据库中的某张表的数据按照该表的某个字段分类输出,比如一张数据表area如下 我们需要将里面的area按照serialize字段进行分类输出,比如这种形式: areas   ...

  2. 微软BI 之SSIS 系列 - 在 SSIS 中将指定目录下的所有文件分类输出到不同文件夹

    开篇介绍 比如有这样的一个需求,旧的一个业务系统通常将产出的文件输出到同一个指定的目录下的不同子目录,输出的文件类型有 XML,EXCEL, TXT 这些不同后缀的文件.现在需要在 SSIS 中将它们 ...

  3. log4j 分类输出

    一个log4j的问题也是折磨了我两天了. 终于算是实现了个符合需求的小demo.然而,我必须吧log4j搞定,这个乐塞. 需求描述: 用xml配置文件,将debug.info.warn.error分类 ...

  4. hadoop MapReduce —— 输出每个单词所对应的文件

    下面是四个文件及其内容. 代码实现: Mapper: package cn.tedu.invert; import java.io.IOException; import org.apache.had ...

  5. log4net通过代码控制按分类输出

    应用场景: 比如我们系统有5个任务,每个任务都是独立的流程,按照传统的方式这些流程的数据会输出到一起,这无疑给我们排查问题增加了难度,因为我们需要的是每一个任务一个独立的输出文件,比如任务A输出到lo ...

  6. logback怎么写?分类输出日志到不同的文件

    此appender有顺序,最好不要乱调顺序,输出日志如下: drwxr-xr-x 2 root root 4096 Dec 3 00:00 2019-12-02drwxr-xr-x 2 root ro ...

  7. Hadoop概念学习系列之为什么hadoop/spark执行作业时,输出路径必须要不存在?(三十九)

    很多人只会,但没深入体会和想为什么要这样? 拿Hadoop来说,当然,spark也一样的道理. 输出路径由Hadoop自己创建,实际的结果文件遵守part-nnnn的约定. 如何指定一个已有目录作为H ...

  8. hadoop 输出中文乱码问题

    本文转载至: http://www.aboutyun.com/thread-7358-1-1.html hadoop涉及输出文本的默认输出编码统一用没有BOM的UTF-8的形式,但是对于中文的输出wi ...

  9. PHP无限级分类的实现(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...

随机推荐

  1. kubernetes命令补全

    # yum install -y bash-completion # locate bash_completion /usr/share/bash-completion/bash_completion ...

  2. SpringBoot初始教程之Servlet、Filter、Listener配置

    1.介绍通过之前的文章来看,SpringBoot涵盖了很多配置,但是往往一些配置是采用原生的Servlet进行的,但是在SpringBoot中不需要配置web.xml的 因为有可能打包之后是一个jar ...

  3. Android 5.0以上heads up通知

    适用Android系统: 1) Android版本>= 5.0 2) 部分ROM是不支持 RemoteViews view=getRemoteViews(body,title, R.mipmap ...

  4. Not so Mobile UVA - 839

    题目链接:https://vjudge.net/problem/UVA-839 题目大意:输入一个树状天平,根据力矩相等原则,判断是否平衡.  如上图所示,所谓力矩相等,就是Wl*Dl=Wr*Dr.  ...

  5. PlayMaker Destroy Self 和 Destroy Object 和 Set Visibility

    1. 这个销毁是销毁状态机所在的游戏物体,不能销毁父物体. 2. 这个销毁只要把想销毁的游戏物体拖进去就可以. 3. 这个其实不是真正的销毁游戏对象,只是把它的 MeshRenderer 组件关上了, ...

  6. mysql主从数据库错误处理

    方法一:忽略错误后,继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 解决: stop slave; #表示跳过一步错误,后面的数字可变set glob ...

  7. wampserver启动时图标不变绿的解决方法

    有2种可能: 1.你安装wamp的时候安装路径中有中文,把路径全部改为英文. 2.其他软件占用了80端口号,解决方法是在服务中找微软的sql server或者其他服务,关掉服务后重启就行了.

  8. Video 视频播放防作弊和禁止下载

    1.实现效果 - 查看源码 实现视频可播放不能下载,禁止右键下载.F12源码打开链接下载 实现只在当前窗口播放,切换窗口.窗口最小化.窗口被遮挡停止播放,恢复后继续播放 在线demo:缓存完再播放 . ...

  9. php数组转json对象并保留数字索引

    本文要解决的问题是php不带索引的数组转换为json对象(而非默认的json数组) php中数组转json使用的方法是系统自带的:json_encode php中数组转json的规则是:当没有指定索引 ...

  10. 对fastdfs 文件清单进行检查,打印无效的文件

    对fastdfs 文件清单进行检查,打印无效的文件2017年12月12日 18:37:18 守望dfdfdf 阅读数:281 标签: fastdfssftpmysql 更多个人分类: 工作 问题编辑版 ...