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")@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实战项目:查找相同字母组成的字谜相关推荐
- Hadoop MapReduce编程 API入门系列之查找相同字母组成的字谜(三)
找出相同单词的所有单词.现在,是拿取部分数据集(如下)来完成本项目. 项目需求 一本英文书籍包含成千上万个单词或者短语,现在我们需要在大量的单词中,找出相同字母组成的所有anagrams(字谜). 思 ...
- Hadoop实战项目之网站数据点击流分析(转载分析)
本文转载于csdn博主'一直不懂' 一,项目业务背景 https://blog.csdn.net/shenchaohao12321/article/details/82958936 二,整体技术流程及 ...
- Hadoop实战——MapReduce对英文单词文本进行统计和排序(超详细教学,算法分析)
B站视频操作过程 Hadoop实战--对单词文本进行统计和排序_哔哩哔哩_bilibili 更多MapReduce设计案例地址 https://github.com/yuanprogrammer/Ma ...
- Hadoop实战实例
Hadoop实战实例 Hadoop 是Google MapReduce的一个Java实现.MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行.就如 ...
- 实战项目 78 : 从 Web API 获取数据
这篇文章分享我的 Android 开发(入门)课程 的第七个和第八个实战项目:书籍列表应用和新闻应用.这两个项目都托管在我的 GitHub 上,分别是 BookListing 和 NewsApp 这两 ...
- 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...
- 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...
- python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!
前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...
- 3d饼图 vue_Vue+Echarts构建可视化大数据平台实战项目分享(附源码)(上)
前言 分享之前我们先来普及一下什么是数据可视化?数据可视化可以把数据从冰冷的数字转换成图形,揭示蕴含在数据中的规律和道理.数据可视化通俗来说就是:数据的展示.处理和分析.目的是借助于图形化手段,清晰有 ...
最新文章
- Python使用matplotlib可视化散点图、可视化两个数值变量之间的关系(Scatter plot)
- Playmaker Input篇教程之Playmaker购买下载和导入
- 您应该知道的6个物联网术语—Vecloud微云
- Apache ZooKeeper - 事件监听机制详解
- 【Qt】QModbusTcpConnectionObserver类
- python的@classmethod和@staticmethod
- 电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
- 取得二进制最右面为1的数
- serverless 构建_使用Serverless,StepFunctions和StackStorm Exchange构建社区注册应用程序-Episode…...
- (需求实战_04)_定时压缩昨天指定文件并删除
- mysql getline_getMessage(),getFile,getLine获取异常用法
- (二)生成深度伪造的方法
- 设计模式 经典书籍必备推荐
- Manacher (马拉车算法)
- 台式计算机组装注意事项,如何组装台式机 组装台式机配置注意事项【详解】...
- 【obs-studio开源项目从入门到放弃】windows 窗口采集和桌面采集的解决方案
- 已知网络号求子网掩码c语言,已知ip地址和其子网掩码如何求网络号子网号主机号 - 已知ip地址求子网掩码_已知ip地址和子网掩码求网络号、子网号和主机号...
- SAP AFS 升级后由于RETURN PO带来的ARUN程序问题
- 5G无线技术基础自学系列 | 双工技术
- nmap渗透测试--版本探测