hadoop实战项目:查找相同字母组成的字谜

前面我们学习了MapReduce编程思想和编程示例,那么本节课程同学们一起操练操练,动手完成下面的项目。

项目需求

一本英文书籍包含成千上万个单词或者短语,现在我们需要在大量的单词中,找出相同字母组成的所有anagrams(字谜)。

数据集

下面是一本英文书籍截取的一部分单词内容。猛戳此链接下载数据集

initiate
initiated
initiates
initiating
initiation
initiations
initiative
initiatives
initiator
initiators
initiatory
inject
injectant
injected
injecting
injection
injections
injector
injectors
injects

思路分析

基于以上需求,我们通过以下几步完成:

1、在 Map 阶段,对每个word(单词)按字母进行排序生成sortedWord,然后输出key/value键值对(sortedWord,word)。

2、在 Reduce 阶段,统计出每组相同字母组成的所有anagrams(字谜)。

数据处理示意流程

在下面单词中,找出相同字母组成的字谜。

cat
tar
bar
act
rat

第一步:经过 map 阶段处理

< act	cat >
< art	tar>
< abr	bar>
< act	act>
< art	rat>

第二步:经过 reduce 阶段处理

< abr	bar>
< act	cat,act>
< art	tar,rat>

程序开发

1、编写程序执行主类:AnagramMain

package com.hadoop.test;
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.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class AnagramMain extends Configured implements Tool{

    @SuppressWarnings( "deprecation")
    @Override
    public  int run(String[] args) throws Exception {
        Configuration conf = new Configuration();

        //删除已经存在的输出目录
        Path mypath = new Path(args[1]);
        FileSystem hdfs = mypath.getFileSystem(conf);
         if (hdfs.isDirectory(mypath)) {
            hdfs.delete(mypath, true);
        }
        Job job = new Job(conf, "testAnagram");
        job.setJarByClass(AnagramMain. class);    //设置主类

        job.setMapperClass(AnagramMapper. class);    //Mapper
        job.setMapOutputKeyClass(Text. class);
        job.setMapOutputValueClass(Text. class);
        job.setReducerClass(AnagramReducer. class);    //Reducer
        job.setOutputKeyClass(Text. class);
        job.setOutputValueClass(Text. class);
         FileInputFormat.addInputPath(job, new Path(args[0]));    //设置输入路径
        FileOutputFormat. setOutputPath(job, new Path(args[1]));    //设置输出路径
        job.waitForCompletion( true);
         return 0;

    }

    public static void main(String[] args) throws Exception{
        String[] args0 = { "hdfs://cloud004:9000/anagram/anagram.txt" ,
                 "hdfs://cloud004:9000/anagram/output"};
         int ec = ToolRunner.run( new Configuration(), new AnagramMain(), args0);
        System. exit(ec);
    }
}

2、编写Mapper:AnagramMapper

package com.hadoop.test;
import java.io.IOException;
import java.util.Arrays;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class AnagramMapper extends Mapper< Object, Text, Text, Text> {

    private Text sortedText = new Text();
    private Text orginalText = new Text();

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

        String word = value.toString();
        char[] wordChars = word.toCharArray();//单词转化为字符数组
        Arrays.sort(wordChars);//对字符数组按字母排序
        String sortedWord = new String(wordChars);//字符数组转化为字符串
        sortedText.set(sortedWord);//设置输出key的值
        orginalText.set(word);//设置输出value的值
        context.write( sortedText, orginalText );//map输出
    }

}

3、编写Reducer:AnagramReducer

package com.hadoop.test;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class AnagramReducer extends Reducer< Text, Text, Text, Text> {

    private Text outputKey = new Text();
    private Text outputValue = new Text();

    public void reduce(Text anagramKey, Iterable< Text> anagramValues,
            Context context) throws IOException, InterruptedException {
            String output = "";
            //对相同字母组成的单词,使用 ~ 符号进行拼接
            for(Text anagam:anagramValues){
                 if(!output.equals("")){
                     output = output + "~" ;
                 }
                 output = output + anagam.toString() ;
            }
            StringTokenizer outputTokenizer = new StringTokenizer(output,"~" );
            //输出anagrams(字谜)大于2的结果
            if(outputTokenizer.countTokens()>=2)
            {
                    output = output.replace( "~", ",");
                    outputKey.set(anagramKey.toString());//设置key的值
                    outputValue.set(output);//设置value的值
                    context.write( outputKey, outputValue);//reduce
            }
    }

}

编译和执行MapReduce作业

1、将项目编译和打包为anagram.jar,使用 SSH 客户端将 anagram.jar上传至hadoop的/home/hadoop/djt目录下。

2、使用cd /home/hadoop/djt 切换到当前目录,通过命令行执行任务。

hadoop jar anagram.jar com.hadoop.test.AnagramMain

查看运行结果

任务的最终结果输出到 HDFS ,使用如下命令查看结果。

[[email protected] hadoop-2.2.0-x64]$ hadoop fs -cat /anagram/output/part-r-00000

部分结果集如下所示。

cehors    cosher,chores,ochres,ochers
cehorst    troches,hectors,torches
cehort    troche,hector
cehortu    toucher,couther,retouch
cehoss    coshes,choses
cehrt    chert,retch
cehstu    chutes,tusche
cehsty    chesty,scythe
ceht    etch,tech
ceiijstu    jesuitic,juiciest
ceiikst    ickiest,ekistic
ceiilnos    isocline,silicone
ceiilnoss    isoclines,silicones
ceiimmnoorss    commissioner,recommission
ceiimmnoorsss    recommissions,commissioners
ceiimorst    isometric,eroticism
ceiimost    semiotic,comities
ceiinnopst    inceptions,inspection
ceiinrsstu    scrutinies,scrutinise
ceiinrst    citrines,crinites,inciters
ceiinrt    citrine,inciter
ceiinss    iciness,incises
ceiintz    citizen,zincite
ceiist    iciest,cities
ceikln    nickel,nickle
ceiklnr    crinkle,clinker
ceiklnrs    clinkers,crinkles
ceiklns    nickels,nickles
ceiklrs    slicker,lickers
ceiklrsst    sticklers,strickles
ceiklrst    trickles,ticklers,stickler
ceiklrt    tickler,trickle
ceiklsst    slickest,stickles
ceiklst    keltics,stickle,tickles
ceiklt    tickle,keltic
ceiknrs    nickers,snicker
ceikorr    rockier,corkier
ceikorst    stockier,corkiest,rockiest
ceikpst    skeptic,pickets
ceikrst    rickets,tickers,sticker
ceil    lice,ceil
ceilmop    compile,polemic
ceilmopr    compiler,complier
ceilmoprs    compliers,compilers
ceilmops    polemics,complies,compiles
ceilnoos    colonise,colonies
ceilnors    incloser,licensor
ceilnorss    inclosers,licensors
 
时间: 2024-10-28 11:36:57

hadoop实战项目:查找相同字母组成的字谜的相关文章

MapReduce实战:查找相同字母组成的单词

1.项目需求 一本英文书籍包含成千上万个单词,现在我们需要在大量的单词中,找出相同字母组成的所有单词 2.数据集 下面是一本英文书籍截取的一部分单词内容(书籍内容是随意写的,主要目的是实现这种需求) 3.分析 1.先看如下图 在上图中,cat.act是相同字母组成的单词,tar.rat也是相同字母组成的单词,bar只有一个,它不显示,因为没有和它是相同字母组成单词 2.基于以上分析,我们通过以下几步完成 1.在Map阶段,对每个word(单词)按字母进行排序生成sortedWord,然后输出ke

MapReduce程序快速入门之查找相同字母组成的字谜

找出相同单词的所有单词.现在,是拿取部分数据集(如下)来完成本项目. 项目需求 一本英文书籍包含成千上万个单词或者短语,现在我们需要在大量的单词中,找出相同字母组成的所有anagrams(字谜). 思路分析 基于以上需求,我们通过以下几步完成: 1.在 Map 阶段,对每个word(单词)按字母进行排序生成sortedWord,然后输出key/value键值对(sortedWord,word). 2.在 Reduce 阶段,统计出每组相同字母组成的所有anagrams(字谜). 1 首先,打开M

查找相同字母组成的字谜

数据集导入HDFS 通过命令行访问刚刚上传至HDFS的数据集 [[email protected] hadoop-2.6.0]$ bin/hdfs dfs -ls /anagram/ MapReduce程序编译及运行: 第一步:在 Map 阶段,对每个word(单词)按字母进行排序生成sortedWord,然后输出key/value键值对(sortedWord,word). //写Map过程 public static class Anagramsmapper extends Mapper<Lo

Hadoop实战实例

Hadoop实战实例 Hadoop 是Google MapReduce的一个Java实现.MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行.就如同java程序员可以不考虑内存泄露一样, MapReduce的run-time系统会解决输入数据的分布细节,跨越机器集群的程序执行调度,处理机器的失效,并且管理机器之间的通讯请求.这样的模式允许程序员可以不需要有什么并发处理或者分布式系统的经验,就可以处理超大的分布式系统得资源. 一.概论 作为Hado

Hadoop实战视频教程完整版 完整的Hadoop大数据视频教程

分享一套迪伦老师的完整的Hadoop实战视频教程,教程从学习Hadoop需要的数据库.Java和Linux基础讲起,非常适合零基础的学员,课程最后结合了实战项目演练,理论结合实战,深入浅出,绝对是当前最为完整.实战的Hadoop教程. <Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标)> 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:230课时 用到技术:部署Hadoop集群 涉及项目:京东商城.百度.阿里巴巴 咨询QQ:1337192913(小公子)

升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)

      Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序

Hadoop实战之三~ Hello World

前言 本文介绍的是在Ubuntu下安装用三台PC安装完成Hadoop集群并运行好第一个Hello World的过程,软硬件信息如下: Ubuntu:12.04 LTS Master: 1.5G RAM,奔腾处理器. Slave1.Slave2:4G RAM,I3处理器. 开始 1 安装Ubuntu : http://cdimage.ubuntu.com/releases/12.04/release/,Ubuntu的安装过程网上有很多,这里不再赘述了,安装之前一定要对Linux的目录树和Mount

Windows 实战项目 001 文件扫描器 (01)

---恢复内容开始--- # Windows 实战项目 001 文件扫描器 (01) - 主要实现功能 -  搜索系统目录文件 -  找到文件并打印输出 - 主要使用到的函数 - FindFirstFile 函数原型: 1 HANDLE WINAPI FindFirstFile( 2 _In_ LPCTSTR lpFileName, 3 _Out_ LPWIN32_FIND_DATA lpFindFileData 4 ); 参数1 lpFileName 搜索的文件名 c:\Windows\*.*

Hadoop实战视频教程下载

Hadoop大数据零基础高端实战培训系列配文本挖掘项目 大数据Hadoop实战视频教程就从最基础的Java语法.数据库.Linux讲起到深入Hadoop大数据技术所必须的所有知识,设计Hadoop生态圈所有常用组件,包括但不限于:Greenplum数据库.HBase.Hive.Pig.ZooKeeper.Chukwa.Hadoop 2.0架构.部署以及YARN.Spark.Storm和Tez.MapReduce和HBase.Sqoop.Flume.Avro.Mahout的Hadoop重要子项目以