热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MapJoin的原理及案例

mapJoin原理:适用于大表join小表,使用DistributedCache机制将小表存储到各个Mapper进程所在机器的磁盘空间上,

mapJoin原理:适用于大表join小表,使用DistributedCache机制将小表存储到各个Mapper进程所在机器的磁盘空间上,各个Mapper进程读取不同的大表分片,将分片中的每一条记录与小表中所有记录进行合并
合并后直接输出map结果即可得到最终结果。

注:不需要进行shuffle流程,也不需要reduce处理


案列: 

detail.txt


order_id    item_id    amout
12    sp001    2
12    sp002    4
12    sp003    3
13    sp001    2
13    sp002    4


iteminfo.txt


item_id    item_type
sp001    type001
sp002    type002
sp003    type002 


package squencefile;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;public class MapJoin {public static class MyMapper extends Mapper{private Map iteminfoMap &#61; new HashMap<>();/***将小表中记录加载到mapper进程机器内存中*/&#64;Overrideprotected void setup(Context context) throws IOException, InterruptedException {super.setup(context);//1、读磁盘空间上的对应小表(废弃)
// URI[] uri&#61;DistributedCache.getCacheFiles(context.getConfiguration());URI[] paths&#61;context.getCacheFiles();for(URI uri:paths){String pathName &#61; uri.toString();//判断是否是iteminfo小表if(!pathName.endsWith("iteminfo.txt")) return;//通过输入流读取磁盘上的文件BufferedReader reader&#61;new BufferedReader(new FileReader(pathName));String str &#61; null;while((str &#61; reader.readLine())!&#61;null){String[] itemInfoArr&#61;str.split("\t");if(itemInfoArr.length&#61;&#61;2){iteminfoMap.put(itemInfoArr[0],itemInfoArr[1]);}}}}/***通过读取大表中的每条记录*/&#64;Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//判断是否是大表数据&#xff0c;需要获取到输入分片的文件名&#xff0c;和大表的文件名进行对比String fileName &#61; ((FileSplit)context.getInputSplit()).getPath().getName();if(fileName.endsWith("detail.txt")){//将分片中的每一条记录与小表中所有记录进行合并String detail&#61;value.toString();String[] detailArr &#61; detail.split("\t");if(detailArr.length !&#61; 3) return;String itemType&#61;iteminfoMap.get(detailArr[1]);if(itemType &#61;&#61; null) return;System.out.print(detailArr);//输出格式&#xff1a;//拼接StringBuffer sb&#61;new StringBuffer();sb.append(itemType).append("\t").append(detailArr[0]).append("\t").append(detailArr[2]);//输出数据context.write(new Text(detailArr[1]),new Text(sb.toString()));}}}//public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//创建一个job&#xff0c;也就是一个运行环境Configuration conf &#61; new Configuration();//判断输出目录是否存在&#xff0c;如果存在就删除FileSystem fs&#61;FileSystem.get(conf);if(fs.exists(new Path("F:\\filnk_package\\hadoop-2.10.1\\data\\test6\\out"))){fs.delete(new Path("F:\\filnk_package\\hadoop-2.10.1\\data\\test6\\out"),true);}//将小表加载到各个Mapper进程所在的机器的磁盘上&#xff08;废弃掉了&#xff09;
// DistributedCache.addCacheFile(new Path("").toUri(),conf);//本地运行Job job&#61;Job.getInstance(conf,"MapJoin");//程序入口&#xff08;打jar包&#xff09;job.setJarByClass(MapJoin.class);//需要输入个文件&#xff1a;输入文件FileInputFormat.addInputPath(job,new Path("F:\\filnk_package\\hadoop-2.10.1\\data\\test6\\detail.txt"));//将小表加载到各个Mapper进程所在机器的磁盘上job.addCacheFile(new Path("F:\\filnk_package\\hadoop-2.10.1\\data\\test6\\iteminfo.txt").toUri());//编写mapper处理逻辑job.setMapperClass(MapJoin.MyMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//输出文件FileOutputFormat.setOutputPath(job,new Path("F:\\filnk_package\\hadoop-2.10.1\\data\\test6\\out"));//运行job&#xff0c;需要放到Yarn上运行boolean result &#61;job.waitForCompletion(true);System.out.print(result?1:0);}
}

 


推荐阅读
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 如何使用 `org.apache.poi.openxml4j.opc.PackagePart` 类中的 `loadRelationships()` 方法及其代码示例详解 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 在处理大数相加的问题时,有许多方法可以借鉴。本文介绍了两种不同的函数式编程方法:一种是从网络上找到的经典实现,另一种是作者自行设计的创新方案。通过函数式编程的方式重新实现了这两种方法,其中经典实现简洁明了,而创新方案则在性能和可读性方面有所提升。这些方法不仅适用于大数相加,还可以扩展应用于其他数值计算场景。 ... [详细]
  • Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用
    Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
author-avatar
手机用户2602911885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有