MapReduce编程:Join应用

1. Reduce Join

Map 端的主要工作:为来自不同表或文件的 key/value 对,打标签以区别不同来源的记录。然后用连接字段作为key ,其余部分和新加的标志作为 value ,最后进行输出。
Reduce 端的主要工作: Reduce 端以连接字段作为 key 的分组已经完成,只需要在每一个分组当中将那些来源于不同文件的记录(在Map 阶段已经打标志)分开,最后进行合并就可以。
缺点 : 这种方式中,合并的操作是在 Reduce 阶段完成, Reduce 端的处理压力太大 , Map节点的运算负载则很低,资源利用率不高,且在 Reduce 阶段极易产生数据倾斜
案例
score.txt
name.txt
输出:
解题思路:
map输出key value是什么?
Map 输出 Key :编号
Map 输出 Value: Bean 对象
reduce输出key value是什么?
Reduce 输出 key Bean 对象
Reduce 输出 value:
ScoreBeann
package com.nefu.zhangna.reducejoin;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class ScoreBeann implements Writable {
    private String uid;
    private String sid;
    private int score;
    private String name;
    private String flag;
    public ScoreBeann() {
    }
    public String getUid(){
        return uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeUTF(uid);
        out.writeUTF(sid);
        out.writeInt(score);
        out.writeUTF(name);
        out.writeUTF(flag);
    }
    @Override
    public void readFields(DataInput in) throws IOException {
        this.uid=in.readUTF();
        this.sid=in.readUTF();
        this.score=in.readInt();
        this.name=in.readUTF();
        this.flag=in.readUTF();
    }
    @Override
    public String toString(){
        return "uid="+this.uid+"\t"+"name:"+this.name+"\t"+"score"+this.score;
    }
}

ScoreMapper

package com.nefu.zhangna.reducejoin;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;

import java.io.IOException;


public class ScoreMapper extends Mapper<LongWritable, Text,Text, ScoreBeann>{
    private Text outk=new Text();
    private ScoreBeann outv=new ScoreBeann();
    private String filename;

    @Override
    protected void setup(Context context){
        FileSplit split=(FileSplit)  context.getInputSplit();
        filename=split.getPath().getName();
    }
    public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException {
        String line=value.toString();
        if (filename.contains("score")){
            String[] sp=line.split("\t");
            outk.set(sp[1]);
            outv.setSid(sp[1]);
            outv.setUid(sp[0]);
            outv.setName("");
            outv.setScore(Integer.parseInt(sp[2]));
            outv.setFlag("score");
        }else {
            String[] sp1=line.split("\t");
            outk.set(sp1[0]);
            outv.setUid("");
            outv.setName(sp1[1]);
            outv.setScore(0);
            outv.setSid(sp1[0]);
            outv.setFlag("name");
        }
        context.write(outk,outv);
    }
}

ScoreReducer

package com.nefu.zhangna.reducejoin;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

public class ScoreReducer extends Reducer<Text, ScoreBeann,ScoreBeann,NullWritable> {
    @Override
    protected void reduce(Text key,Iterable<ScoreBeann> values,Context context) throws IOException, InterruptedException {
        ArrayList<ScoreBeann> scoreBeanns=new ArrayList<ScoreBeann>();
        ScoreBeann namebean=new ScoreBeann();
        for (ScoreBeann value:values){
            if("score".equals(value.getFlag())){
                ScoreBeann tmpbean=new ScoreBeann();
                try {
                    BeanUtils.copyProperties(tmpbean,value);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                scoreBeanns.add(tmpbean);
            }else {
                try {
                    BeanUtils.copyProperties(namebean,value);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
        for(ScoreBeann scoreBeann:scoreBeanns){
            scoreBeann.setName(namebean.getName());
            context.write(scoreBeann,NullWritable.get());
        }
    }
}

ScoreDriver

package com.nefu.zhangna.maxcount;


import com.nefu.zhangna.reducejoin.ScoreBeann;
import com.nefu.zhangna.reducejoin.ScoreMapper;
import com.nefu.zhangna.reducejoin.ScoreReducer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
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 java.io.File;
import java.io.IOException;

public class ScoreDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration configuration=new Configuration();
         Job job=Job.getInstance(configuration);
         job.setJarByClass(ScoreDriver.class);
         job.setMapperClass(ScoreMapper.class);
         job.setReducerClass(ScoreReducer.class);
         job.setMapOutputKeyClass(Text.class);
         job.setMapOutputValueClass(ScoreBeann.class);
         job.setOutputKeyClass(ScoreBeann.class);
         job.setOutputValueClass(NullWritable.class);
        FileInputFormat.setInputPaths(job,new Path("D:\\cluster\\input"));
        FileOutputFormat.setOutputPath(job,new Path("D:\\cluster\\score"));
        boolean result=job.waitForCompletion(true);
        System.exit(result?0:1);
    }
}

缺点 : 这种方式中,合并的操作是在 Reduce 阶段完成, Reduce 端的处理压力太大 , Map节点的运算负载则很低,资源利用率不高,且在 Reduce 阶段极易产生数据倾斜

2. Map Join

1) 使用场景 Map Join 适用于一张表十分小、一张表很大的场景。
2) 优点
思考 : Reduce 端处理过多的表,非常容易产生数据倾斜。怎么办 ?
Map 端缓存多张表,提前处理业务逻辑,这样增加 Map 端业务,减少 Reduce 端数
据的压力,尽可能的减少数据倾斜

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决IDEA编译/启动报错:Abnormal build process termination

报错信息 报错信息如下&#xff1a; Abnormal build process termination: "D:\Software\Java\jdk\bin\java" -Xmx3048m -Djava.awt.headlesstrue -Djava.endorsed.dirs\"\" -Djdt.compiler.useSingleThreadtrue -Dpreload.project.path………………很纳…

Mybatis之增删改查

一、引言 书接上回&#xff0c;我们在了解完mybatis之后&#xff0c;肯定要知道怎么使用&#xff0c;本文就来详细讲解Mybatis的增删改查事务&#xff0c;还不了解怎么配置mybatis的童鞋可以去这篇文章了解一下通俗易懂讲解javaweb之mybatis-CSDN博客 二、Mybatis——增 举例…

RK3568驱动指南|第八篇 设备树插件-第77章 注册group容器实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

高校/企业如何去做数据挖掘呢?

随着近年来人工智能及大数据、云计算进入爆发时期&#xff0c;依托三者进行的数据分析、数据挖掘服务已逐渐成为各行业进行产业升级的载体&#xff0c;缓慢渗透进我们的工作和生活&#xff0c;成为新时代升级版的智能“大案牍术”。 那么对于多数企业来说&#xff0c;如何做数据…

MyBatis:动态 SQL 标签

MyBatis 动态 SQL 标签if 标签where 标签trim 标签choose 、when 、otherwise 标签foreach 标签附 动态 SQL 标签 MyBatis 动态 SQL 标签&#xff0c;是一组预定义的标签&#xff0c;用于构建动态的 SQL 语句&#xff0c;允许在 SQL 语句中使用条件、循环和迭代等逻辑。通过使…

Java代码审计Mybatis注入文件上传下载读取(非常详细!!)

目录 0x00 前言 0x01 Mybatis注入审计 - 若依&#xff08;Ruoyi&#xff09;后台管理系统 4.6.0 1、项目介绍与部署 - Ruoyi 2、若依 Ruoyi - Mybatis注入 - 代码审计 3、代审常搜词 - Java SQL 注入 0x02 文件上传漏洞审计 - Inxedu && Tmall 1、项目介绍与部署…

UE4移动端最小包优化实践

移动端对于包大小有着严苛的要求,然而UE哪怕是一个空工程打出来也有90+M,本文以一个复杂的工程为例,探索怎么把包大小降低到最小。 一、工程简介 工程包含代码、插件、资源、iOS原生库工程。 二、按官方文档进行基础优化 官方文档 1、勾选Use Pak File和Create comp…

linux buffer的回写的触发链路

mark_buffer_dirty中除了会标记dirty到buffer_head->state、page.flag、folio->mapping->i_pages外&#xff0c;还会调用inode所在文件系统的dirty方法&#xff08;inode->i_sb->s_op->dirty_inode&#xff09;。然后为inode创建一个它所在memory group的wri…

Moonbeam生态项目分析 — — 游戏项目The Great Escape

概览 The Great Escape是一款2D的Play and Earn平台游戏&#xff0c;曾入选MoonbeamMoonbeam Accelerator&#xff0c;并经此培训孵化后于2023年7月正式发表。 玩家必须在给定时间内在充满敌人和陷阱的关卡中收集尽可能多的水果。游戏结束后&#xff0c;游戏主要根据收集的水…

SpringSecurity深度解析与实践(2)

目录 引言1.Springboot结合SpringSecurity用户认证流程1.1 配置pom文件1.2.配置application.yml 2.自定义MD5加密3.BCryptPasswordEncoder密码编码器4.RememberMe记住我的实现5.CSRF防御5.1.什么是CSRF 引言 上篇网址 1.Springboot结合SpringSecurity用户认证流程 1.1 配置p…

大开关与计算机技术

大开关与计算机技术 一、引言 随着科技的飞速发展&#xff0c;计算机技术已经成为了我们生活中不可或缺的一部分。在这个信息化的时代&#xff0c;大开关作为计算机硬件中的重要组成部分&#xff0c;发挥着至关重要的作用。本文将详细介绍大开关的基本概念、原理以及在计算机…

利用Matplotlib画简单的线形图

实验题目&#xff1a;简单的线形图 实验目的&#xff1a;利用Matplotlib画简单的线形图 实验环境&#xff1a;海豚大数据和人工智能实验室&#xff0c;使用的Python库 名称 版本 简介 numpy 1.16.0 线性代数 Pandas 0.25.0 数据分析 Matplotlib 3.1.0 数据可视化 …

CMake项目管理

背景 目前看到很过很多框架&#xff0c;很好奇大家如何从头搭建一个C的库&#xff0c;这里简单介绍一个基本模板. 参考&#xff1a;https://zhuanlan.zhihu.com/p/631257434 目录组织 假如项目名称叫project&#xff0c; 一般可以按照下面的方式组织代码&#xff0c;这里可以…

深入浅出堆排序: 高效算法背后的原理与性能

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;堆排序一个基于二叉堆数据结构的排序算法&#xff0c;其稳定性和排序效率在八大排序中也…

浏览器开发者工具(Developer Tools)详解

作为一名前端开发人员&#xff0c;熟练应用浏览器开发工具很重要。笔者在这方面的知识未成体系&#xff0c;最近在跟着chorme官方文档学习&#xff0c;于是整理了本文&#xff0c;如有不足&#xff0c;欢迎指正。 目录 1.elements(元素) 2.console(控制台) 3.sources(源代码…

逻辑斯蒂回归-建模概率计算(鸢尾花)

导入的数据说明 因为气候不同&#xff0c;造就性不同&#xff0c;统计鸢尾花的关键特征数据&#xff1a;花萼长度、花萼宽度、花瓣长度&#xff0c;花瓣宽度 植物学家划分&#xff1a; setosa(中文名&#xff1a;山鸢尾) versicolor(中文名&#xff1a;杂色鸢尾) virginica(中…

React学习计划-React16--React基础(三)收集表单数据、高阶函数柯里化、类的复习

1. 收集表单数据 包含表单的组件分类 受控组件——页面中所有输入类的DOM,随着输入&#xff0c;把值存维护在状态里&#xff0c;需要用的时候去状态里取值&#xff08;推荐&#xff0c;避免了过渡使用ref&#xff09;非受控组件——页面中所有输入类的DOM&#xff0c;现用现取…

高级算法设计与分析(五) -- 回溯法

系列文章目录 高级算法设计与分析&#xff08;一&#xff09; -- 算法引论 高级算法设计与分析&#xff08;二&#xff09; -- 递归与分治策略 高级算法设计与分析&#xff08;三&#xff09; -- 动态规划 高级算法设计与分析&#xff08;四&#xff09; -- 贪心算法 高级…

LED电子屏幕正迎来人屏互动技术

随着科技的不断进步&#xff0c;LED电子屏幕正迎来人屏互动技术的未来。传统LED电子屏幕一直以来只是作为显示器&#xff0c;实现单向传播&#xff0c;缺乏人群互动和观众参与的乐趣。然而&#xff0c;随着LED显示屏厂家技术的不断创新&#xff0c;LED电子屏幕正在摆脱单向传播…

C++基础语法总结

C使用 C的源文件扩展名是&#xff1a;cppC程序的入口是main函数C完全兼容c语言的语法 1、cin、cout C中常使用cin、cout进行控制台的输入和输出 #include <iostream> using namespace std;int main() {cout << "hello world !!!" << endl;retu…