【大数据技术Hadoop+Spark】MapReduce之单词计数和倒排索引实战(附源码和数据集 超详细)

news2025/1/19 12:52:40

源码和数据集请点赞关注收藏后评论区留言私信~~~

一、统计单词出现次数

单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版“Hello World。其主要功能是统计一系列文本文件中每个单词出现的次数

程序解析

首先MapReduce将文件拆分成splits,由于测试用的文件较小,只有二行文字,所以每个文件为一个split,并将文件按行分割形成<key, value>对,如下图所示,这一步由MapReduce框架自动完成,其中偏移量(即key值)包括了回车所占的字符数(Windows和Linux环境会不同)

 (2)将分割好的<key, value>对交给用户定义的Map方法进行处理,生成新的<key, value>对

(3)得到Map方法输出的<key,value>对后,Mapper会将它们按照key值进行排序,并执行Combine过程,将key至相同value值累加,得到Mapper的最终输出结果 

(4)Reducer先对从Mapper接收的数据进行排序,再交由用户自定义的Reduce方法进行处理,得到新的<key,value>对,并作为WordCount的输出结果

 

主要编写Map和Reduce函数.这个Map函数使用StringTokenizer函数对字符串进行分隔,通过write方法把单词存入word中 k/v来自于Map函数中的context,可能经过了进一步处理(combiner),同样通过context输出

运行程序后通过浏览器访问页面即可获取结果

代码如下

package com.bigdata.wc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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.hadoop.util.GenericOptionsParser;

import java.io.IOException;
import java.util.StringTokenizer;


public class WordCount {


    public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable> {


        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();


        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                System.out.println(word);
                context.write(word, one);
            }
        }
    }


    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("hadoop.home.dir", "D:\\hadoop-2.7.0");
        System.setProperty("HADOOP_USER_NAME", "root");
        Configuration conf = new Configuration();
        conf.set("yarn.resourcemanager.address", "bigdata01:8032");
        conf.set("dfs.client.use.datanode.hostname", "true");
        conf.set("fs.defaultFS", "hdfs://bigdata02:9000/");
        conf.set("mapreduce.app-submission.cross-platform", "true");
        conf.set("mapreduce.framework.name", "yarn");
        conf.set("mapred.jar","D:\\hadoopdemo\\WordCount\\target\\WordCount-1.0-SNAPSHOT-jar-with-dependencies.jar");
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        for (int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        FileOutputFormat.setOutputPath(job,
                new Path(otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

 二、倒排索引

倒排索引是文档检索系统中最常用的数据结构,被广泛应用于全文搜索引擎。倒排索引主要用来存储某个单词(或词组)在一组文档中的存储位置的映射,提供了可以根据内容来查找文档的方式,而不是根据文档来确定内容,因此称为倒排索引(Inverted Index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(Inverted File)。

现假设有三个源文件file1.txt、file2.txt和file3.txt,需要使用倒排索引的方式对这三个源文件内容实现倒排索引,并将最后的倒排索引文件输出。

 首先,使用默认的TextInputFormat类对每个输入文件进行处理,得到文本中每行的偏移量及其内容。Map过程首先分析输入的<key,value>键值对,经过处理可以得到倒排索引中需要的三个信息:单词、文档名称和词频。

经过Map阶段数据转换后,同一个文档中相同的单词会出现多个的情况,而单纯依靠后续Reduce阶段无法同时完成词频统计和生成文档列表,所以必须增加一个Combine阶段,先完成每一个文档的词频统计。

 

经过上述两个阶段的处理后,Reduce阶段只需将所有文件中相同key值的value值进行统计,并组合成倒排索引文件所需的格式。

 

 效果测试如下

 

 部分代码如下 全部代码和数据集请点赞关注收藏后评论区留言私信

package com.mr.InvertedIndex;

import java.io.IOException;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class InvertedIndexReducer extends Reducer<Text, Text, Text, Text> {  
	  
    private static Text result = new Text();  
  
    // 输入:<MapReduce file3:2>  
    // 输出:<MapReduce file1:1;file2:1;file3:2;>  
    @Override  
    protected void reduce(Text key, Iterable<Text> values, Context context)  
            throws IOException, InterruptedException {  
        // 生成文档列表  
        String fileList = new String();  
        for (Text value : values) {  
            fileList += value.toString() + ";";  
        }  
  
        result.set(fileList);  
        context.write(key, result);  
    }  
}  

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你的代码会说话吗?(下)

篇首语 代码不讲真话的直接后果是所有人被误导了&#xff0c;然后做了一件错误的事情&#xff0c;不自知地将错就错&#xff0c;让错误越陷越深&#xff0c;最后浪费宝贵的时间。可不讲真话&#xff0c;编写代码的人又不是故意的&#xff0c;也万万不可上纲上线&#xff0c;袁…

力扣(LeetCode)1785. 构成特定和需要添加的最少元素(C++)

贪心 统计所有元素的加和 sumsumsum &#xff0c;计算 sumsumsum 到 goalgoalgoal 的距离&#xff0c;尽可能用 limitlimitlimit 的步长去走这段距离(贪心)&#xff0c;最后一步可能是 111 ~ limitlimitlimit 。 CCC 的除法是向 000 取整&#xff0c;为了统计最后一步&#xf…

深入理解网络编程精华

hi 大家好&#xff0c;我是大师兄&#xff0c;让我们一起来学习一下网络编程&#xff0c;对网络编程的核心知识进行梳理&#xff0c;希望大家早日掌握这些核心知识&#xff0c;打造自己坚实的基础。详细点击查看-> 极客星球。以上是深入理解网络编程部分ppt。感兴趣的同学可…

phoenix使用注意事项

使用phoenix的版本是5.0.0-HBase-2.0&#xff0c;DBeaver的版本是21.3(7.1.5版本也试过可以) 用DBeaver连接出现的问题处理 1.需要把已安装hbase服务器/opt/hbase/lib目录下的jar包全部下载来 1.1 常规配置 1.2 DBeaver编辑驱动把原来的库给删除掉&#xff0c;加入下载下来的…

MacOS Monterey 12.6.2 (21G320) OC 0.8.7 / Cl 5150 / PE 三分区原版黑苹果镜像

1‌2月14日苹果推送了 Ventura 13.1更新&#xff0c;解决了从图形驱动程序到 WebKit 到内核的一些问题&#xff0c;以及 Safari、天气、照片等方面的 Bug。对于无法更新到 Ventura 的用户可以安装 macOS Monterey 12.6.2 或 macOS Big Sur 11.7.2&#xff0c;以获得针对某些漏洞…

【AI with ML】第 7 章 :用于自然语言处理的递归神经网络

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Java+MySQL共享单车管理系统的设计与实现

随着时代的发展&#xff0c;我国的国民经济一直在稳步的提升&#xff0c;共享单车的是用来一直在不断的攀升&#xff0c;为了能够更加方便快捷的管理共享单车&#xff0c;需要开发一套利用计算机进行管理的JSP共享单车管理系统。 本项目利用软件工程原理&#xff0c;采用面向对…

先聊聊「内存分配」,再聊聊Go的「逃逸分析」。

前言 大家好&#xff0c;我是阳哥。 今天和大家聊聊Go语言的「内存分配」和「逃逸分析」。 这期内容不仅有文档&#xff0c;而且有视频&#xff1a; # Go语言的内存分配和逃逸分析-理论篇 # Go语言的内存分配和逃逸分析-实践总结篇 要搞清楚GO的逃逸分析一定要先搞清楚内…

数据处理指令(二)—— 数据运算指令(加减乘)+ 逻辑运算指令(与或)+ 位清零(BIC)

无论是数据运算还是逻辑运算&#xff0c;需要满足如下格式&#xff1a; <操作码> <目标寄存器> <第一操作寄存器> <第二操作数> 操作码&#xff1a; 表示执行哪种操作&#xff08;加减乘&#xff09;目标寄存器&#xff1a; 用…

搭建zabbix并分离

目录 &#x1f951;理论部分 &#x1f951;实验部分 &#x1f336;️安装zabbix &#x1f336;️部署zabbix &#x1f336;️配置zabbix &#x1f955;1. 修改语言 &#x1f955;2. 监控linux端 &#x1f336;️分离zabbix 理论部分 1. 监控知识概述 &#xff08;1&#xff0…

消息队列中间件

如何保证消息的顺序性 我举个例子&#xff0c;我们以前做过一个 mysql binlog 同步的系统&#xff0c;压力还是非常大的&#xff0c;日同步数据要达到上亿&#xff0c;就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去&#xff08;mysql -> mysql&#xff…

【AI with ML】第 8 章 :使用 TensorFlow 创建文本

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

开源项目-仓库管理系统

哈喽&#xff0c;大家好&#xff0c;今天给大家带来一个仓库管理系统 系统主要包括客户管理&#xff0c;供应商管理&#xff0c;商品管理&#xff0c;进货管理&#xff0c;退货管理&#xff0c;销售管理&#xff0c;销售退货管理等模块 技术选型 后台技术选型 SpringBoot Sh…

PHP ktv点歌管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP ktv点歌管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据库为 mysql5.0&#xff0c;使用php语言开发。 P…

语义表示法

思路方案 在安全领域的研究中我们发现&#xff0c;很多数据预处理的步骤&#xff0c;在不同的场景下中都可以相互 借鉴&#xff0c;甚至可以进行直接复用。例如&#xff0c;对于加密流量相关的数据&#xff0c;当算法工程师 获取到一批加密流量的 pcap 包之后&#xff0c;不论他…

详解即时通讯音视频开发实时语音通讯丢包补偿技术

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 现如今&#xff0c;随着移动互联网越来越普及&#xf…

【复习笔记】计算机组成原理复习重点——篇六

计算机组成原理复习重点笔记 第三篇 中央处理器 第6章 计算机的运算方法第7章 指令系统第8章 CPU的结构和功能 第&#xff16;章 计算机的运算方法 6.1 无符号数和有符号数 6.2 数的定点表示和浮点表示 6.3 定点运算 6.4 浮点四则运算 6.5 算术逻辑单元 6.1 定点数的表示 真值…

【JAVA程序设计】基于JAVA Swing的飞机票订票系统-有报告

基于JAVA Swing的飞机票订票系统零、项目获取一、项目简介二、开发环境三、项目结构四、运行截图零、项目获取 获取方式&#xff08;点击下载&#xff09;&#xff1a;是云猿实战 项目经过多人测试运行&#xff0c;可以确保100%成功运行。 一、项目简介 本项目是基于JAVA Sw…

华玉通软“雨燕”通信中间件通过德国莱茵TÜV ISO 26262 ASILD级功能安全产品认证

华玉通软&#xff08;下称“华玉”&#xff09;今天宣布“雨燕”通信中间件&#xff08;SWIFT DDS&#xff09;已通过独立第三方检测、检验和认证机构----德国莱茵TV集团&#xff08;下称*TV莱茵*&#xff09;的ISO 26262 ASIL D级功能安全产品认证&#xff0c;成为国内首个基于…

【简单项目实战】用C++实现学生成绩管理系统 | [面向对象]

目录 ●功能介绍 ●案例 ●代码展示 ●结果展示 ●功能介绍 用 C设计一个程序&#xff0c;能提供下列功能: 1. 录入学生成绩信息。按照学号&#xff0c;姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语的格式录入学生的成绩。 2.展示目前录入学生的成绩信息。以学…