hadoop join之map side join

在本例中,我们仍然采用上一例中的数据文件。之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输。Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:(1)用户使用静态方法DistributedCache.addCacheFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://jobtracker:50030/home/XXX/file)。JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。(2)用户使用DistributedCache.getLocalCacheFiles()方法获取文件目录,并使用标准的文件读写API读取相应的文件。

本实例中的运行参数需要三个,加入在hdfs中有两个目录input和input2,其中input2存放user.csv,input存放order.csv,则运行命令格式如下:hadoop jar xxx.jar JoinWithDistribute input2/user.csv input output。

具体实例如下,此实例我们采用旧的API来写

public class JoinWithDistribute extends Configured implements Tool
{public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text>{//用于缓存小表的数据,在这里我们缓存user.csv文件中的数据private Map<String, String> users = new HashMap<String, String>();private Text outKey = new Text();private Text outValue = new Text();//此方法会在map方法执行之前执行@Overridepublic void configure(JobConf job){BufferedReader in = null;try{//从当前作业中获取要缓存的文件Path[] paths = DistributedCache.getLocalCacheFiles(job);String user = null;String[] userInfo = null;for (Path path : paths){if (path.toString().contains("user.csv")){in = new BufferedReader(new FileReader(path.toString()));while (null != (user = in.readLine())){userInfo = user.split(",", 2);//缓存文件中的数据users.put(userInfo[0], userInfo[1]);}}}}catch (IOException e){e.printStackTrace();}finally{try{in.close();}catch (IOException e){e.printStackTrace();}}}public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException{//首先获取order文件中每条记录的userId,//再去缓存中取得相同userId的user记录,合并两记录并输出之。String[] order = value.toString().split(",");String user = users.get(order[0]);if(user != null){outKey.set(user);outValue.set(order[1]);output.collect(outKey, outValue);}}}public int run(String[] args) throws Exception{JobConf job = new JobConf(getConf(), JoinWithDistribute.class);job.setJobName("JoinWithDistribute");job.setMapperClass(MapClass.class);job.setNumReduceTasks(0);job.setInputFormat(TextInputFormat.class);job.setOutputFormat(TextOutputFormat.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//我们把第一个参数的地址作为要缓存的文件路径DistributedCache.addCacheFile(new Path(args[0]).toUri(), job);FileInputFormat.setInputPaths(job, new Path(args[1]));FileOutputFormat.setOutputPath(job, new Path(args[2]));JobClient.runJob(job);return 0;}public static void main(String[] args) throws Exception{int res = ToolRunner.run(new Configuration(), new JoinWithDistribute(), args);System.exit(res);}}

转发:https://blog.csdn.net/huashetianzu/article/details/7821674

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

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

相关文章

git学习(7):创建ssh key时遇到“Bad escape character ‘ygen’.”

问题&#xff1a; 创建ssh key时遇到“Bad escape character ‘ygen’.” image.png $ ssh -keygen -t rsa -C "" Bad escape character ygen. 分析原因&#xff1a;ssh -keygen之间出现了空格&#xff0c;正确命令是没有空格的

Web中的鼠标自动移动

其实只是一个模拟&#xff0c;思路是这样的&#xff1a;让鼠标消失&#xff0c;再用一个跟鼠标一样的图片跟随鼠标移动&#xff0c;这样我们就可以控制这个图片的移动了。。。囧&#xff5e; 怎样让鼠标消失呢&#xff0c;就是做一个高宽1px的透明cur文件&#xff0c;并把其设置…

用小程序·云开发打造运动圈小程序丨实战

乒乓圈小程序 和朋友合伙写了一个小程序&#xff0c;写了一个以共享乒乓信息和交流的平台———乒乓圈。我们使用了微信的云开发来完成数据和后台的作用。免去了租赁服务器。 我主要负责的是数据库的设计和云函数实现数据获取和触发器的功能和简单的两个页面。 正文 功能展示 页…

hadoop join之semi join

SemiJoin&#xff0c;也叫半连接&#xff0c;是从分布式数据库中借鉴过来的方法。它的产生动机是&#xff1a;对于reduce side join&#xff0c;跨机器的数据传输量非常大&#xff0c;这成了join操作的一个瓶颈&#xff0c;如果能够在map端过滤掉不会参加join操作的数据&#x…

git学习(9):git 添加 ssh keys 出现如下错误

git 添加 ssh keys 出现如下错误&#xff1a; Key is invalid. It must begin with ssh-ed25519, ssh-rsa, ssh-dss, ecdsa-sha2-nistp256, ends 在终端输入如下命令 $ ssh-keygen -t rsa -b 4096 -C "809753922qq.com" 最后得到 id_rsa.pub $ cd ~/.ssh $ vi id…

BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试

在Web表单提交后解析表单时&#xff0c;一般框架都提供了某种方式可以自动从表单映射到我们的POJO类里面。属性会被自动填充的。 但如果我们在某个需求里&#xff0c;真的需要用程序来解析的话&#xff0c;那么如果有几百个属性&#xff0c;可就是一个噩梦了。 我们可以用java的…

【vue开发】vue导出Excel表格教程demo

前端工作量最多的就是需求&#xff0c;需求就是一直在变&#xff0c;比如当前端数据写完之后&#xff0c;需要用Excel把数据下载出来&#xff1b;再比如前端在没有数据库想写些demo玩时&#xff0c;也是很好的选择。 第一步安装依赖包,修改配置 1、装依赖&#xff1a; cnpm ins…

git学习(10):Git的使用--如何将本地项目上传到Github(两种简单、方便的方法)

将本地项目上传到Github&#xff08;两种简单、方便的方法&#xff09; 一、第一种方法&#xff1a; 首先你需要一个github账号&#xff0c;所有还没有的话先去注册吧&#xff01; https://github.com/ 我们使用git需要先安装git工具&#xff0c;这里给出下载地址&#xff0…

MapReduce 中的两表 join 几种方案简介

1. 概述 在传统数据库&#xff08;如&#xff1a;MYSQL&#xff09;中&#xff0c;JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操作&#xff0c;同样常见且耗时&#xff0c;由于Hadoop的独特设计思想&#xff0c;当进行JOIN操作时&#xff0c;有一些特殊的技巧。 …

.NET中栈和堆的比较1

原文出处&#xff1a; http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx 尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection)&#xff0c;但是我们还是应该了解它们&#xff0c;以优化我们的…

前端学习(1):HTML和CSS导学

最近为什么捡起前端&#xff0c;主要工作太忙&#xff0c;有时间就会抓一下后端&#xff0c;前端是我以前啃得比较多的 再来一次呢&#xff0c;工作在忙也不能停止学习勒 第一部分 第二部分 第三部分 第四部分 如何学习

Spring Boot----Dubbo原理分析

环境&#xff1a;需要创建一个dubbo.xml 通过ImportResource()导入xml&#xff1a; 1、首先spring启动解析配置文件的每一个标签的总接口是 org.springframework.beans.factory.xml.BeanDefinitionParser 2、DubboBeanDefinitionParser是它的一个实现类&#xff0c;通过调用par…

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的&#xff0c;会对查询的结果做一次全局排序&#xff0c;所以说&#xff0c;只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理&#xff08;不管有多少map&#xff0c;也不管文件有多少…

最有价值的100句话

1:能不抽烟最好不抽&#xff0c;它或许可以帮助你吸引一些女生&#xff0c;但不抽绝不会招来厌烦&#xff0c;表现男子气概的途径有很多&#xff0c;没必要拿健康做赌注。    2&#xff1a;给自己定目标&#xff0c;一年&#xff0c;两年&#xff0c;五年&#xff0c;也许你…

前端学习(2):什么是html和css

什么是HTML&#xff1f; W3C&#xff1a;万维网联盟&#xff0c;是目前web技术领域最具权威和影响力的标准机构&#xff0c;目前为止&#xff0c;W3C已发布了200多项影响深远的web技术标准及实施指南。 Hypertext markup language:超文本标记语言&#xff0c;该语言书写的代码通…

基于小程序·云开发构建高考查分小程序丨实战

2019高考报名人数达到了 1031 万的新高&#xff0c;作为一名三年前参考高考的准程序猿&#xff0c;赶在高考前&#xff0c;加班加点从零开始做了一款高考查分小程序&#xff0c;算是一名老学长送给学弟学妹们的高考礼。上线仅 1 个月&#xff0c;用户数就突破了 1k&#xff0c;…

浅谈 DML、DDL、DCL的区别

一、DML DML&#xff08;data manipulation language&#xff09;数据操纵语言&#xff1a;就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。 SELECT 列名称 FROM 表名称 UPDATE 表名称 SET 列名称 新值 WHERE 列名称 某值 IN…

前端学习(3):vs code编辑器

下载地址 https://code.visualstudio.com 下载安装教程 变成中文 在编辑器中运行我们的网页 open in browser view in browser 选中文件----首选项----设置 常用快捷键

QuickPart应用系列

在上一篇解决方案包部署与收回篇章中&#xff0c;我只是稍微提了下QuickPart.也许刚接触这块内容的朋友&#xff0c;可能还不是很清楚&#xff0c;QuickPart具体的功能能实现什么。首先要告诉你的是QuickPart的人性化之处&#xff0c;那就是给开发人员开发webpart提供更简洁的方…

spring----IOC知识点

//可以修改Bean定义的属性(不是修改Bean) Component public class TulingBeanFactoryProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {beanFactory.getBean…