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 ,使用如下命令查看结果。
[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
hadoop实战项目:查找相同字母组成的字谜的更多相关文章
- MapReduce实战项目:查找相同字母组成的字谜
实战项目:查找相同字母组成的字谜 项目需求:一本英文书籍中包含有成千上万个单词或者短语,现在我们要从中找出相同字母组成的所有单词. 数据集和期望结果举例: 思路分析: 1)在Map阶段,对每个word ...
- MapReduce实战:查找相同字母组成的单词
1.项目需求 一本英文书籍包含成千上万个单词,现在我们需要在大量的单词中,找出相同字母组成的所有单词 2.数据集 下面是一本英文书籍截取的一部分单词内容(书籍内容是随意写的,主要目的是实现这种需求) ...
- Hadoop实战项目:小文件合并
项目背景 在实际项目中,输入数据往往是由许多小文件组成,这里的小文件是指小于HDFS系统Block大小的文件(默认128M),早期的版本所定义的小文件是64M,这里的hadoop-2.2.0所定义的小 ...
- Hadoop实战实例
Hadoop实战实例 Hadoop实战实例 Hadoop 是Google MapReduce的一个Java实现.MapReduce是一种简化的分布式编程模式,让程序自动分布 ...
- 升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)
Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系 ...
- .NET Core实战项目之CMS 第九章 设计篇-白话架构设计
前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...
- .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能.今天我将带着大家一起来 ...
- Vue2.5开发去哪儿网App 从零基础入门到实战项目
第1章 课程介绍本章主要介绍课程的知识大纲,学习前提,讲授方式及预期收获. 1-1 课程简介 试看第2章 Vue 起步本章将快速讲解部分 Vue 基础语法,通过 TodoList 功能的编写,在熟悉基 ...
- Hadoop实战之三~ Hello World
本文介绍的是在Ubuntu下安装用三台PC安装完成Hadoop集群并运行好第一个Hello World的过程,软硬件信息如下: Ubuntu:12.04 LTS Master: 1.5G RAM,奔腾 ...
随机推荐
- SVN如何新建用户并分配权限
打开SVN服务端,找到特定的项目目录,单击右键,然后点击属性: 在弹出的页面中,点击增加: 在增加的页面中,你可以选择之前已经创建的用户,也可以重新创建用户名和密码: 如果是选择已经有的用 ...
- 【转】Silverlight全开源工作流设计器
声明 此工作流是作者自行构思和设计的被动式数据触发模式的工作流.没有遵循各种现有的工作流设计标准(如WFMC或WSFL),也没有与其他工作流通用性的接口规范.这里体现更多的是作者对工作流的使用思想,及 ...
- [Spring Data MongoDB]学习笔记--MapReduce
mongodb的MapReduce主要包含两个方法:map和reduce. 举个例子,假设现在有下面3条记录 { "_id" : ObjectId("4e5ff893c0 ...
- 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则
原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数. ...
- EasyPlayer.js网页全终端播放器安装使用文档
EasyPlayer.js 集 rtmp, hls, flv, websocket 于一身的网页直播/点播播放器, 使用简单, 功能强大 属性(Property) video-url 视频流地址 St ...
- grafana-----Time Range Controls
Grafana提供了许多方法来管理时间的可视化数据的范围,在Dashboard-level和Panel-level都有. 在右上角,您有主仪表板时间选择器(它位于“Zoom out”和“Refresh ...
- 系统盘的消耗 谨慎的日志存储到系统盘+日志级别!! 569 error_log = /usr/local/php7/logs/php-error.log 26 error_log = /usr/local/php7/logs/fpm_error_log
案例: 系统盘一夜之间骤增近20G nginx + php-fpm cat /usr/local/nginx/conf/nginx.conf 查看对请求的处理 4个配置文件 /usr/local/n ...
- js验证表单大全2
屏蔽右键 很酷 oncontextmenu="return false" ondragstart="return false"onselectstart=&q ...
- make编译四
书写命令 每条规则中的命令和操作系统 Shell 的命令行是一致的. make 会按顺序一条一条的执行命令, 每条命令的开头必须以[Tab]键开头, 除非,命令是紧跟在依赖规则后面的分号后的.在命令行 ...
- Pycharm中SQL语句提示SQL Dialect is Not Configured
解决办法: 在File---->Setting--->Languages & Frameworks--->SQL Dialects中,选择对应的数据库,如MySQL,之后点击 ...