hadoop join之semi join

SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO。实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。此实例中,还是采用第一个实例中的数据,假如我们只过滤sex为1的user,并将key存于user_id文件中(注意:每行的数据一定要带上双引号啊),如下:

"ID"
"1"
"2"
"3"
"5"
"6"
"8"
"9"

完整代码如下,此实例中我们采用新的API来写:


public class SemiJoin extends Configured implements Tool
{public static class MapClass extends Mapper<LongWritable, Text, Text, Text>{// 用于缓存user_id文件中的数据private Set<String> userIds = new HashSet<String>();private Text key = new Text();private Text value = new Text();private String[] keyValue;// 此方法会在map方法执行之前执行@Overrideprotected void setup(Context context) throws IOException, InterruptedException{BufferedReader in = null;try{// 从当前作业中获取要缓存的文件Path[] paths = DistributedCache.getLocalCacheFiles(context.getConfiguration());String userId = null;for (Path path : paths){if (path.toString().contains("user_id")){in = new BufferedReader(new FileReader(path.toString()));while (null != (userId = in.readLine())){userIds.add(userId);}}}}catch (IOException e){e.printStackTrace();}finally{try{if(in != null){in.close(); }}catch (IOException e){e.printStackTrace();}}}public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException{// 在map阶段过滤掉不需要的数据this.keyValue = value.toString().split(",");if(userIds.contains(keyValue[0])){this.key.set(keyValue[0]);this.value.set(keyValue[1]);context.write(this.key, this.value);}}}public static class Reduce extends Reducer<Text, Text, Text, Text>{private Text value = new Text();private StringBuilder sb;public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{sb = new StringBuilder();for(Text val : values){sb.append(val.toString());sb.append(",");}this.value.set(sb.deleteCharAt(sb.length()-1).toString());context.write(key, this.value);}}public int run(String[] args) throws Exception{Job job = new Job(getConf(), "SemiJoin");job.setJobName("SemiJoin");job.setJarByClass(SemiJoin.class);job.setMapperClass(MapClass.class);job.setReducerClass(Reduce.class);job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);String[] otherArgs = new GenericOptionsParser(job.getConfiguration(), args).getRemainingArgs();// 我们把第一个参数的地址作为要缓存的文件路径DistributedCache.addCacheFile(new Path(otherArgs[0]).toUri(), job.getConfiguration());FileInputFormat.addInputPath(job, new Path(otherArgs[1]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[2]));return job.waitForCompletion(true) ? 0 : 1;}public static void main(String[] args) throws Exception{int res = ToolRunner.run(new Configuration(), new SemiJoin(), args);System.exit(res);}}

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

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

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

相关文章

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…

Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

GROUPING SETS 该关键字可以实现同一数据集的多重group by操作。事实上GROUPING SETS是多个GROUP BY进行UNION ALL操作的简单表达&#xff0c;它仅仅使用一个stage完成这些操作。GROUPING SETS的子句中如果包含()数据集&#xff0c;则表示整体聚合。 Aggregate Query with GRO…

前端学习(4):chome浏览器

一、认识浏览器 浏览器是网页显示、运行的平台&#xff0c;常用的浏览器有IE、火狐&#xff08;Firefox&#xff09;、谷歌&#xff08;Chrome&#xff09;、Safari和Opera等。我们平时称为五大浏览器。IE最新版为Edge。 常用浏览器 二、浏览器市场份额 可以通过百度的统计网…

JS的IE和Firefox兼容性总结

JS的IE和Firefox兼容性汇编(原作:hotman_x) 以下以 IE 代替 Internet Explorer&#xff0c;以 MF 代替 Mozzila Firefox 1. document.form.item 问题 (1)现有问题&#xff1a; 现有代码中存在许多 document.formName.item(&q…

spring----注解

以后想到了在写 1、DependsOn("xx") User bean被创建之前&#xff0c;先创建xx bean; DependsOn("xx") public class User{private int id; }转载于:https://www.cnblogs.com/yanxiaoge/p/11479628.html