9.Join的应用

news2024/9/22 0:39:11

1.reduceJoin的应用

案例:将两个表合并成一个新的表

               

需求分析通过将关联条件作为Map输出的key(此处指pid),将两表满足Join条件的数据并携带数据所来源的文件信息,发往同一个ReduceTask,在Reduce中进行数据的串联

思路:

map:

将输入数据统一封装为一个Bean,此Bean包含了商品表和订单表的所有公共和非公共属性,相当于进行了全外连接,并新增加一个属性——文件名称,以区分数据是来自与商品表还是订单表,便于在reduce阶段数据的 处理;map输出的key是pid,value是bean

shuffle:

根据pid对bean进行排序,所有pid相同的数据都会被聚合到同一个key下,发往同一个reducetask

reduce:

对同一个pid下所有的bean,首先要区分出它们是来自于哪个表,是商品表还是订单表。如果是商品表,数据只有一条,保存其中的pname属性;如果是订单表,数据有多条,用保存的pname属性替换pid属性,并输出

 代码:

(1)创建表格合并后的Order类

public class OrderPd implements Writable {
    private String id; //订单id
    private String pid; //产品id
    private int amount; //产品数量
    private String pname; //产品名称
    private String flag; //判断是order表还是pd表的标志字段
}

一键生成set/get/构造函数(略过)

重写toString():

  @Override
    public String toString() {
        return id + "\t" + pname + "\t" + amount;
    }

将这五个特征序列化:

    public void write(DataOutput out) throws IOException {
        out.writeUTF(id);
        out.writeUTF(pid);
        out.writeInt(amount);
        out.writeUTF(pname);
        out.writeUTF(flag);
    }

反序列化:

    public void readFields(DataInput in) throws IOException {
        this.id = in.readUTF();
        this.pid = in.readUTF();
        this.amount = in.readInt();
        this.pname = in.readUTF();
        this.flag = in.readUTF();
    }

 (2)编写mapper类:将两个表上下拼接到了一起

 思路:先获取文件名,然后根据不同的文件名执行不同的操作

 (3)编写reducer类:将一组的数据完成join

       接受的key就是pid,value就是orderpd,输出的就只有orderpd.

思路:先找到一行中的pname,然后将来自order中的数据设置pname并输出

ps.以上的reducer类存在优化空间,因为创建临时变量的时候需要不断的new新空间,浪费大量内存,因此做出已下改进:每处理一次对象,就用之前申请的那个对象

(4)编写driver类

 2.Mapjoin的应用

定义

没有reduce过程,所有的工作都在map阶段完成,极大减少了网络传输和io的代价。如何实现:

上述的join过程可以看作外表与内表的连接过程,外表是订单表,外表大,外表是处理的对象;内表是商品表,内表小,内表是写进内存的对象。所以可以把内表事先缓存于各个maptask结点,然后等到外表的数据传输过来以后,直接用外表的数据连接内表的数据并输出即可

思路:

1)在driver中设置加载缓存文件,这样每个maptask就可以获取到该文件 ; 设置reducetask个数为0,去除reduce阶段,对应到这个需求就是遍历order表的时候,把pd表做成一个map写入缓存中方便随时调用拿到pname

2)在setup方法中读取缓存文件,并将结果以kv的形式存入hashmap,k是pid,v是pname

3)在map方法中,根据pid,通过hashmap找到pname,替换pid,写出结果

 代码

(1)mapper类

(2)driver类

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

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

相关文章

汇编小程序解析--3D立方体旋转

汇编小程序解析–3D立方体旋转,源代码如下,是vulture大神于1995年写的,我到现在才基本看懂。 ;本程序由国外的Vulture大哥编写,并公布了源码,这个是他95年的一个作品,可以说是在当时是非常成功的&#xff…

论shell之条件语句-if语句、case语句

目录 一:条件测试 1.文件测试 2.常见的测试操作符 3.整数值比较 ​4.字符串比较 ​5. 逻辑测试 二:if语句 1.单分支结构 2.单分支结构实例 3.双分支结构 4.双分支结构实例 5.多分支结构 6.多分支机构实例 7.嵌套if语句实例 三:case语…

2023企业服务的关键词:做强平台底座

作者 | 曾响铃 文 | 响铃说 4月下旬,软件行业相关的大会紧锣密鼓地开了好几场,不仅有政府主办的2023中国国际软件发展大会、中国软件创新发展大会,也有用友、浪潮等服务商举办的品牌活动,让软件业的话题一直保持热度。 以用友为…

十大排序算法简单总结与对比

假设排序均从小到大排序 排序算法工作原理平均时间复杂度最坏时间复杂度空间复杂度是否稳定排序冒泡排序把相邻元素两两比较,若左侧的元素大于右侧的元素,则交换,否则不交换。(每一轮最大的会跑到最右边)O(&#xff0…

VGA协议实践

文章目录 前言一、VGA接口定义与传输原理1、VGA接口定义2、传输原理3、不同分辨率对应不同参数 二、Verilog编程1、VGA显示彩色条纹2、VGA显示字符3、输出一幅彩色图像4、Quartus操作1、添加PLL核2、添加ROM核 三、全部代码四、总结五、参考资料 前言 VGA的全称是Video Graphi…

VBA最基础的趣味速成练习--VBA资料

很多朋友想学VBA,但是苦于无处入手,我特意花了几天时间,做了一个VBA速成练习表格 能让你快速上手VBA,感受到VBA的神奇之处,相信我们日常使用表格的朋友会非常喜欢它的, 下面是我们的表格界面,…

选择营销自动化软件时的3个常见错误

做出投资营销自动化软件的决定是一个重大决定,可能很难知道从哪里开始,尤其是当市场上有这么多选择时。选择正确的自动化软件可能是拥有良好的营销运营与拥有低效营销团队之间的区别。在这篇博文中,我们将讨论人们在选择营销自动化软件时最常…

Flink之TaskManager内存解析

一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况,ck decline和ck expire: (1)ck decline 发生ck decline情况时,我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…

排序 - 选择排序(Selection sort)

文章目录 选择排序介绍选择排序实现选择排序的时间复杂度和稳定性选择排序时间复杂度选择排序稳定性 代码实现核心&总结 每日一道算法,提高脑力。第四天,选择排序。 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#…

Shiro详解(超全面)

目录: 一、简介二、Shiro的整体架构1、Subject2、Security Manager3、Cryptography4、Authenticator5、Authorizer6、realm7、sessionManager8、SessionDAO9、CacheManager 三、入门案例四、认证流程1、认证流程2、常见异常 五、授权流程1、授权流程2、自定义realm实现授权 六、…

JavaScript日期库之date-fn.js

用官网的话来说,date-fn.js 就是一个现代 JavaScript 日期实用程序库,date-fns 为在浏览器和 Node.js 中操作 JavaScript 日期提供了最全面、但最简单和一致的工具集。那实际用起来像它说的那么神奇呢,下面就一起来看看吧。 安装 安装的话就…

深度学习 -- pytorch 计算图与动态图机制 autograd与逻辑回归模型

前言 pytorch中的动态图机制是pytorch这门框架的优势所在,阅读本篇博客可以使我们对动态图机制以及静态图机制有更直观的理解,同时在博客的后半部分有关于逻辑回归的知识点,并且使用pytorch中张量以及张量的自动求导进行构建逻辑回归模型。 …

Springboot 自动装配流程分析

目录 1.基础知识: 2.具体代码执行流程 3.流程总结: 4.参考文章: 1.基础知识: springboot的自动装配是利用了spring IOC容器创建过程中的增强功能,即BeanFactoryPostProcessor, 其中的ConfigurationCla…

【JavaEE】SpringBoot的日志

目录 日志作用 SpringBoot日志框架 日志打印 日志级别 类型 作用 修改级别 日志永久化 配置日志文件目录 配置日志文件名 简化日志打印和永久化——lombok 日志作用 问题定位:可以帮助开发人员快速找到问题出现的位置系统监控:可以把系统的运…

你不知道的node.js小知识——使用nvm管理node版本及node与npm版本对应关系详解

一、下载和安装nvm管理包 (1)下载链接 https://github.com/coreybutler/nvm-windows/releases (我选的是nvm-setup.exe) (2)解压安装 (2次选择文件要安装的目录 第一次是nvm 第二次是node.js) (…

01.DolphinScheduler集群搭建

文章目录 关于Apache DolphinScheduler简介特性简单易用丰富的使用场景High ReliabilityHigh Scalability 软硬件环境建议配置1. Linux 操作系统版本要求2. 服务器建议配置生产环境 3. 网络要求4. 客户端 Web 浏览器要求 官网地址 单机部署(没啥用)前置准备工作启动 DolphinSch…

J - Playing in a Casino

题意:相当于比大小的赌博计算赌徒一共需要支出多少赌资 比大小的规则很简单,是 在这个游戏中,有一个套牌由n卡。每张卡都有m数字写在上面。每个n玩家从一副牌中只收到一张牌。 然后所有玩家成对玩,每对玩家只玩一次。因此&#x…

SpringBoot 中 4 种常用的数据库访问方式

SpringBoot 中常用的数据库访问方式主要有以下几种: SpringBoot 是一个非常流行的 Java 开发框架,它提供了大量的开箱即用的功能,包括数据库访问。在开发过程中,我们经常需要使用数据库,因此选择一种合适的数据库访问…

Day2_vue集成elementUI完善布局

上一节,实现了从O到vue页面主体框架的搭建,这一节补充完善搜索框;新增、删除、导入、导出等按钮;表格设置;分页;面包屑的实现! 目录 搜索框 新增删除、导入、导出按钮 表格设置 设置边框&a…

记录安装Nodejs和HBuilderX搭建、部署微信小程序开发环境(一)

文章目录 1 前言2 注册小程序账号3 安装微信开发者工具4 安装Nodejs和HBuilderX4.1 windows用户安装Nodejs4.2 macos/linux用户安装Nodejs4.3 安装HBuilder X 5 创建项目5.1 新建一个项目5.2 进行基本配置 6 HBuilderX同步微信开发者工具6.1 打开服务端口6.2 调用微信开发者工具…