Hadoop-统计红楼梦里出现名字的次数(MapReduce学习)

package org.bigdata508.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
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.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.bigdata.util.HadoopCfg;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class DreamOfRedMansion {
    public static Set<String> dic = new HashSet<>();
    static {
        String ProjectPath = DreamOfRedMansion.class.getResource("/").getFile().toString();
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(
                    ProjectPath + File.separator + "\DreamOfRed.txt")));
            String line=null;
            while((line=br.readLine())!=null){
                line=line.replaceAll("\s+", "");
                dic.add(line);
            }
            br.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static List<String> parse(String text){
        List<String> words = new ArrayList<String>();
        //创建IKAnalyzer中文分词对象  
        IKAnalyzer analyzer = new IKAnalyzer();  
        // 使用智能分词  
        analyzer.setUseSmart(true);
        // 分词
        StringReader reader = new StringReader(text);
        try {
            TokenStream ts = analyzer.tokenStream("content",reader);
            CharTermAttribute strs = ts.getAttribute(CharTermAttribute.class);
            ts.addAttribute(CharTermAttribute.class); 
            // 遍历分词数据
            while (ts.incrementToken()) {
                if(dic.contains(strs.toString())){
                    words.add(strs.toString());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        reader.close();
        return words;
    }
    
    private static class DreamOfRedMansionMapper extends Mapper<LongWritable, Text, Text, LongWritable> {

        @Override
        protected void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {
            List<String> names = parse(value.toString());
            for (String name : names) {
                context.write(new Text(name), new LongWritable(1));
            }
        }
    }

    private static class DreamOfRedMansionReducer extends Reducer<Text, LongWritable, Text, LongWritable> {

        @Override
        protected void reduce(Text key, Iterable<LongWritable> values,
                Context context) throws IOException, InterruptedException {
            Long sum = 0L;
            for (LongWritable value : values) {
                sum = sum + value.get();
            }
            context.write(new Text(key+","), new LongWritable(sum));
        }
    }

    public static class DreamOfRedMansionSortMapper extends Mapper<LongWritable, Text, LongWritable, Text>{

        @Override
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, LongWritable, Text>.Context context)
                throws IOException, InterruptedException {
            LongWritable data = new LongWritable(Integer.parseInt(value.toString().split(",")[1].trim()));
            context.write(data, new Text(value.toString().split(",")[0]));
        }
        
    }
    
    public static class DreamOfRedMansionSortReduce extends Reducer<LongWritable, Text, Text, LongWritable>{

        @Override
        protected void reduce(LongWritable key, Iterable<Text> values,
                Reducer<LongWritable, Text, Text, LongWritable>.Context context) throws IOException, InterruptedException {
            for(Text str : values){
                context.write(str, key);
            }
        }
        
    }
    public static void main(String[] args) throws Exception{
            Configuration cfg = HadoopCfg.getInstance();
            Job job = Job.getInstance(cfg);
            job.setJobName("DreamOfRedMansion");
            job.setJarByClass(DreamOfRedMansion.class);

            // mapper
            job.setMapperClass(DreamOfRedMansionMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(LongWritable.class);

            // reducer
            job.setReducerClass(DreamOfRedMansionReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(LongWritable.class);

            FileInputFormat.addInputPath(job, new Path("/DreamOfRedMansionInput"));
            FileOutputFormat.setOutputPath(job, new Path("/red_Out/"));
            job.waitForCompletion(true);

            Configuration conf = HadoopCfg.getInstance();
            Job job2 = Job.getInstance(conf);
            job2.setJobName("DreamOfRedMansionSort");
            job2.setJarByClass(DreamOfRedMansion.class);

            // sortmapper
            job2.setMapperClass(DreamOfRedMansionSortMapper.class);
            job2.setMapOutputKeyClass(LongWritable.class);
            job2.setMapOutputValueClass(Text.class);

            // sortreducer
            job2.setReducerClass(DreamOfRedMansionSortReduce.class);
            job2.setOutputKeyClass(Text.class);
            job2.setOutputValueClass(LongWritable.class);

            FileInputFormat.addInputPath(job2, new Path("/red_Out"));
            FileOutputFormat.setOutputPath(job2, new Path("/red_Out_sort/"));

            job2.waitForCompletion(true);
    }

}
dic词典获取匹配名字:
DreamOfRed.txt


林黛玉 薛宝钗 贾元春 贾迎春 贾探春 贾惜春 李纨 妙玉 湘云 王熙凤 贾巧姐 秦可卿 晴雯 麝月 袭人 鸳鸯 雪雁 紫鹃 碧痕 平儿 香菱 金钏 司棋 抱琴 赖大 焦大 王善保 周瑞 林之孝 乌进孝 包勇 吴贵 吴新登 邓好时 王柱儿 余信 庆儿 昭儿 兴儿 隆儿 坠儿 喜儿 寿儿 丰儿 住儿 小舍儿 李十儿 玉柱儿 贾敬 贾赦 贾政 贾宝玉 贾琏 贾珍 贾环 贾蓉 贾兰 贾芸 贾蔷 贾芹 琪官 芳官 藕官 蕊官 药官 玉官 宝官 龄官 茄官 艾官 豆官 葵官 妙玉 智能 智通 智善 圆信 大色空 净虚 彩屏 彩儿 彩凤 彩霞 彩鸾 彩明 彩云 甄宝玉 薛宝琴 薛蟠 薛蝌 王夫人 王子腾 王仁 尤老娘 尤氏 尤二姐 尤三姐 贾敏 贾瑞 贾代儒 贾代化 贾代修 贾代善 詹光 单聘仁 程日兴 王作梅 石呆子 张华 冯渊 张金哥 茗烟 扫红 锄药 伴鹤小鹊 小红 小蝉 刘姥姥 马道婆 宋嬷嬷 张妈妈 秦锺 蒋玉菡 柳湘莲 东平王 乌进孝 冷子兴 山子野 方椿 载权 夏秉忠 周太监 裘世安 抱琴 司棋 侍画 入画 珍珠 琥珀 玻璃 翡翠 二木头 二丫头 卜氏 卜世仁 卜固修 入画 入画之叔 入画之婶 于老爷 大了 大姐 大姐儿 万儿 万虚 山子野 小红 小霞 小螺 小蝉 小鹊 小厮 小丫头 小幺儿 小内监 小舍儿 小蝉儿 小鸠儿 小道士 小吉祥儿 川宁侯 门子 义忠亲王 卫若兰 女尼 女先儿 马尚 马魁 马道婆 丰儿 王仁 王氏 王公 王成 王兴 王忠 王荣 王信 王一贴 王大人 王大夫 王大妈 王大爷 王子胜 王子腾 王太医 王尔调 王奶奶 王奶妈 王老爷 王作梅 王住儿 王君效 王希献 王和荣 王济仁 王青儿 王板儿 王狗儿 王家的 王短腿 王善保 王道士 王嬷嬷 王成之父 王兴媳妇 王信家的 王子腾夫人 王住儿媳妇 王善保家的 云儿 云光 云老爷五儿 五嫂子 元春 木居士 太妃 太上皇 太祖皇帝 尤氏 尤二姐 尤三姐 尤老娘 尤婆子 尤氏母亲 尤老安人 少妃 牛清 牛继宗 毛半仙 乌进孝 乌庄 长府官 长安守备 长安府知府 长安守备之子 仇都尉 凤姐 凤哥 凤丫头 凤哥儿 凤辣子 文化 文官 文清 文妙真人 方杏 方椿 引泉 引愁 金女 双寿 双瑞 孔继宗 书吏 水溶 水仙庵姑子 玉官 玉桂 玉爱 玉桂儿 玉钏儿 玉钏儿娘 玉桂儿家 玉桂儿媳妇 玉柱儿媳妇 巧姐 艾官 可人 可儿 石头 石光珠 石呆子 石头 呆子 平儿 平安节度 东平郡王 世荣 田妈 叶生 叶妈 史公 史鼎 史鼐 史太君 史湘云 史鼎夫人 史鼐夫人 史湘云夫 史湘云父 史湘云母 四儿 四姐 四姐儿 北静王 北静郡王 北静王妃 包勇 白玉钏 白老媳妇 白老媳妇儿 乐善郡王 外藩王爷 宁国公 冯仆 冯唐 冯渊 冯胖子 冯紫英 司棋 司棋妈 邢氏 邢忠 邢大舅 夫人 邢岫烟 邢嫂子 邢德全 老三 老赵 老僧 老太妃 老苍头 老田妈 老宋妈 老祝妈 老张妈 老叶妈 老王家的 老王道士 西平王爷 西宁郡王 灰待者 毕大人 毕知庵 扫红 扫花 豆官 同贵 同喜朱大娘 朱嫂子 多官儿 多姑娘 多浑虫 多姑娘儿 色空 邬将军 庆儿 庆国公 刘四 刘氏 刘妈 刘大夫 刘铁嘴 兴儿 安国公 许氏 守备之子 阴阳生 孙大人 孙绍祖 寿儿 寿山伯 芸香 芳官 花母 花自芳 花姐姐 花袭人 花大姐姐 严老爷 杏奴 李二 李氏 李妈 李纨 李孝 李纹 李贵 李祥 李绮 李德 李十儿 李少爷 李奶子 李奶奶 李守忠 李先儿 李店主 李宫裁 李员外 李御史 李婶子 李婶娘 李衙内 李嬷嬷 杨氏 杨待郎 杨提督 来升 来兴 来旺 来喜 来旺儿 来升媳妇 来旺之子 来旺家的 来旺媳妇 来喜家的 来喜媳妇 吴良 吴贵 吴兴 吴大人 吴大娘 吴天佑 吴巡抚 吴贵儿 吴贵妃 吴贵妻 吴新登 吴兴登 吴兴家的 吴贵媳妇 吴新登媳妇 吴巡抚大人 时觉 时福 呆霸王 何三 何妈 何婆 住儿 伴鹤 余信 余信家的 迎春 迎春妈 冷子兴 冷子兴家的 沁香 沈世兄 沈嬷嬷 宋妈 宋妈妈 宋嬷嬷 忘仁 良儿 妙玉 张二 张大 张三 张公 张华 张材 张暂 张大夫 张王氏 张太医 张友士 张先生 张老爷 张奶妈 张如圭 张法官 张若锦 张金哥 张财主 张家的 张真人 张道士 张德辉 张爷爷 张大老爷 张材家的 陈翼 陈也俊 陈瑞文 坠儿 坠儿娘 青儿 英莲 茄官 林三 林海 林妈 林大娘 林之孝 林如海 林红玉 林之孝妇 林之孝家的 玫瑰花儿 板儿 枕霞旧友 拐子 抱琴 旺儿 旺儿家的 旺儿嫂子 旺儿媳妇 忠靖侯 忠义亲王 忠顺王爷 忠顺亲王贤德妃佳蕙 侍书 佩凤 金氏 金荣 金星 金钏 金哥 金彩 金文翔 金钏儿 金寡妇 金鸳鸯 金文翔妇 金文翔家的 金文翔的媳妇 金彩妻 狗儿周氏 周琼 周瑞 周二爷 周大娘 周大妈 周太监 周公子 周奶妈 周妈妈周贵妃 周姐姐 周家的 周姨娘 周嫂子 周财主 周瑞家的 周瑞媳妇 郑华郑好时 郑华家的 郑好时媳妇 郑好时家的 怡红公子 单大良 单大娘 单聘仁炒豆儿 净虚 宝玉 宝官 宝珠 宝钗 宝蟾 定儿 定城侯 空空道人 春纤 春燕 珍珠 珍大奶奶 珍大嫂子 玻璃 封氏 封肃 赵全 赵天栋 赵天梁 赵太监 赵亦华 赵老爷 赵奶妈 赵堂官 赵国基 赵侍郎 赵姨娘赵嬷嬷 赵姨奶奶 茜雪 药官 茫茫大士 荣国公 胡氏 胡太医 胡老爷胡君荣 胡斯来 胡道长 胡庸医 胡山子野 胡老名公 南安王 南安郡王南安王太妃 栓儿 柳氏 柳芳 柳彪 柳妈 柳五儿 柳家的 柳湘莲 柳嫂子柳婶子 柳二媳妇 柳家媳妇 柱儿 挑雪 临安伯 临昌伯 临安伯诰命临昌伯诰命 临安伯老太太 昭儿 昭容 钟情大士 秋纹 秋桐 秋菱 秋爽居士香怜 香菱 皇上 皇帝 皇太后 侯孝康 侯晓明 保宁侯 俞禄 度恨菩提 娄氏祝妈 神瑛侍者 送玉人 费大娘 娇红 娇杏 绛珠草 绛珠仙草 绛珠仙子绛花洞主 秦氏 秦显 秦钟 秦鲸卿 秦显之妻 秦显家的 素云莲花儿 莺儿 莺儿娘 栓儿 桂儿家的 贾化 贾氏 贾兰 贾母 贾芝 贾芸 贾芷 贾芬 贾芳 贾环 贾法 贾范 贾珍 贾荇 贾复 贾珖 贾珠 贾珩 贾效 贾菱 贾菌 贾萍 贾婆 贾琮 贾琛 贾蓝 贾菖 贾蓁 贾蓉 贾源 贾蔷 贾演 贾璜 贾璎 贾璘 贾敷 贾蘅 贾藻 贾天祥 贾代化 贾代修 贾代善 贾代儒 贾存周 贾雨村 贾时飞 贾恩侯 贾巧姐 贾喜鸾 贾四姐儿 贾蓉媳妇 贾琼之母 贾(王扁)之母 夏三 夏忠 夏妈 夏太太 夏太监 夏奶奶 夏金桂 夏守忠 夏秉忠 夏婆子 圆信 钱升 钱华 钱槐 倪二 兼美 通事官 绣凤 绣桔 绣鸾 琏二奶奶 黄莺 黄莺儿 曹雪芹 梅翰林 梅翰林之子 戚建辉 菱洲袭人 聋子老妈妈 雪雁 探春 惜春 紫云 紫绡 银姐 银蝶儿 偕鸾 偕鸳 彩儿 彩云 彩凤 彩屏 彩明 彩哥 彩鸾 彩嫔 彩霞 彩儿娘 彩霞妈 隆儿 绮霞 琪官 琪官儿 琥珀 靓儿 喜儿 喜鸾 葫芦僧 蒋子宁 蒋玉函 韩奇葵官 黑儿 景田侯 锄药 智通 智能 智善 智能儿 嵇好古 程日兴 傅试 傅秋芳 焦大 粤海将军 焙茗 善姐 善姐儿 谢鲲 跛足道人 渺渺真人 娲皇媚人 缕儿 瑞珠 瑞大奶奶 甄母 甄费 甄士隐 甄夫人 甄友忠 甄英莲 甄宝玉 甄应嘉 甄家娘子 甄应嘉夫人 蓉哥儿 蓉哥儿媳妇 赖二 赖大 赖升 赖尚荣 赖嫂子 赖嬷嬷 赖二家的 赖大家的 赖大奶奶 赖升家的 赖大的媳妇 裘良 裘世安 裘太监 龄官 畸人 傻大姐 傻大舅 傻大姐妈 锦乡侯锦 乡侯诰命 詹光 詹会 詹子亮 鲍二 鲍音 鲍太医 鲍二家的 鲍二媳妇 痴梦仙姑 碧月 碧痕 翡翠 静虚 槛外人 算命先生 潇湘妃子 嫣红 翠云 翠缕翠墨 璜嫂子 璜大奶奶 蕙香 蕉下客 蕊官 蕊珠 醉金刚 墨雨 篆儿 稻香老农 潘又安 潘三保 鹤仙 缮国公 靛儿 薛父 薛公 薛文起 薛姨妈 霍启臻儿 鹦哥 鹦鹉 穆莳 戴权 戴良 檀云 襄阳侯 藕官 藕榭 癞头僧 蘅芜君 警幻仙子 警幻仙姑 颦儿 颦卿

小说文本:DreamOfRedMansion.txt

原文地址:https://www.cnblogs.com/Decmber/p/5491887.html