前面我们学习了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")@Overridepublic  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);    //Mapperjob.setMapOutputKeyClass(Text. class);job.setMapOutputValueClass(Text. class);job.setReducerClass(AnagramReducer. class);    //Reducerjob.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 ,使用如下命令查看结果。

[hadoop@cloud004 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

 

转载于:https://www.cnblogs.com/bob-wzb/p/5145787.html

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

  1. Hadoop MapReduce编程 API入门系列之查找相同字母组成的字谜(三)

    找出相同单词的所有单词.现在,是拿取部分数据集(如下)来完成本项目. 项目需求 一本英文书籍包含成千上万个单词或者短语,现在我们需要在大量的单词中,找出相同字母组成的所有anagrams(字谜). 思 ...

  2. Hadoop实战项目之网站数据点击流分析(转载分析)

    本文转载于csdn博主'一直不懂' 一,项目业务背景 https://blog.csdn.net/shenchaohao12321/article/details/82958936 二,整体技术流程及 ...

  3. Hadoop实战——MapReduce对英文单词文本进行统计和排序(超详细教学,算法分析)

    B站视频操作过程 Hadoop实战--对单词文本进行统计和排序_哔哩哔哩_bilibili 更多MapReduce设计案例地址 https://github.com/yuanprogrammer/Ma ...

  4. Hadoop实战实例

    Hadoop实战实例   Hadoop 是Google MapReduce的一个Java实现.MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行.就如 ...

  5. 实战项目 78 : 从 Web API 获取数据

    这篇文章分享我的 Android 开发(入门)课程 的第七个和第八个实战项目:书籍列表应用和新闻应用.这两个项目都托管在我的 GitHub 上,分别是 BookListing 和 NewsApp 这两 ...

  6. 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

  7. 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

  8. python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!

    前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...

  9. 3d饼图 vue_Vue+Echarts构建可视化大数据平台实战项目分享(附源码)(上)

    前言 分享之前我们先来普及一下什么是数据可视化?数据可视化可以把数据从冰冷的数字转换成图形,揭示蕴含在数据中的规律和道理.数据可视化通俗来说就是:数据的展示.处理和分析.目的是借助于图形化手段,清晰有 ...

最新文章

  1. Python使用matplotlib可视化散点图、可视化两个数值变量之间的关系(Scatter plot)
  2. Playmaker Input篇教程之Playmaker购买下载和导入
  3. 您应该知道的6个物联网术语—Vecloud微云
  4. Apache ZooKeeper - 事件监听机制详解
  5. 【Qt】QModbusTcpConnectionObserver类
  6. python的@classmethod和@staticmethod
  7. 电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
  8. 取得二进制最右面为1的数
  9. serverless 构建_使用Serverless,StepFunctions和StackStorm Exchange构建社区注册应用程序-Episode…...
  10. (需求实战_04)_定时压缩昨天指定文件并删除
  11. mysql getline_getMessage(),getFile,getLine获取异常用法
  12. (二)生成深度伪造的方法
  13. 设计模式 经典书籍必备推荐
  14. Manacher (马拉车算法)
  15. 台式计算机组装注意事项,如何组装台式机 组装台式机配置注意事项【详解】...
  16. 【obs-studio开源项目从入门到放弃】windows 窗口采集和桌面采集的解决方案
  17. 已知网络号求子网掩码c语言,已知ip地址和其子网掩码如何求网络号子网号主机号 - 已知ip地址求子网掩码_已知ip地址和子网掩码求网络号、子网号和主机号...
  18. SAP AFS 升级后由于RETURN PO带来的ARUN程序问题
  19. 5G无线技术基础自学系列 | 双工技术
  20. nmap渗透测试--版本探测

热门文章

  1. HDU2191 多重背包或者01背包 xingxing在努力
  2. 同一用户最新登录踢掉历史登录【原创】
  3. Linux 零拷贝方案
  4. Checksum 校验和
  5. java获取元素创建时间,java – 动态顺序统计:在恒定时间内获取第k个元素?
  6. (2)FPGA面试技能提升篇(Perl脚本)
  7. ZYNQ PS端输出不准确时钟供PL使用
  8. FPGA状态机二段式
  9. FPGA设计经验总结
  10. android 微信 demo,android微信分享demo