两表join在业务开发中是经常用到,了解了大数据join的原理,对于开发有很大的好处。

1、reduce side join

reduce side join是一种简单的join的方法,具体思想如下:
顾名思义就在reduce进行join,
在map阶段,map同时读取两文件file1,file2,为了区分key/value需要对两文件进行打标签,比如:tag=0 表示file1 tag=1 表示file2,
map阶段主要的任务就是对不同的数据打上不同的标签。
在reduce阶段,reduce函数会从file1,file2中获取相同key的value list,然后对相同key的file1和file2 进行join,即reduce 阶段进行实际的连接操作。

http://blog.csdn.net/huashetianzu/article/details/7819244

2、map side join

顾名思义就是在map端进行join,因为reduce side join 是非常低效的,需要在shuffle的过程中进行大量的数据传输,因为map阶段不能获取到所有需要的join的字段,即:同一个key对应的字段可能位于不同的map中。
map side join 一般是指需要一张大表,一张小表,小表可以直接放到内存中,这样我们可以将小表复制到各个map端进行join,每个map端都会存一份,一般在内存中(比如hash table)然后只扫描大表,对于大表中的每一条key/value,在小表中找到相同key的记录,如果有则输出。
http://blog.csdn.net/huashetianzu/article/details/7821674

3、semi join

semi join 也叫半连接,这个是从分布式数据库中借鉴过来的。产生的动机呢,主要是reduce side join 跨机器传输数据量非常大,这成了join的一个瓶颈,如果能在map端过滤掉不会参加join操作的数据,可以大大的节省了IO。

实现方法:先选取一张小表,假设是file1,把参与join的key抽取出来,保存在file3中,file3文件一般很小,可以放到内存中,这样把file3拷贝到每个taskTracker中,然后将file2中不在file3中的数据过滤掉,剩下的就与reduce side join相同。
http://blog.csdn.net/huashetianzu/article/details/7823326

4、reduce side join + BloomFilter

这个也是semi join的一个延伸,主要是有时sem join抽取出来的key在内存中依然存放不下,这时可以用BloomFilter来节省空间,
BloomFilter最常见的作用是:判断某个元素是否在一个集合里面,通过判断元素是否存在来过滤,
因而可将小表中的key保存到BloomFilter中,根据BloomFilter算法,在map阶段过滤大表,可能有一些不在小表中的记录没有被过滤掉(但是在小表中的记录一定不会过滤掉),这样只是增加了少量的IO。
http://blog.csdn.net/jiaomeng/article/details/1495500
http://baike.baidu.com/link?url=xLbNuk12FJSSlzLRmcWpQ1OaPbPYIvVUaackA6d_N77kYdyEqYVWUsgXbmo65iVotcnzODV_CvbuMQqbBtOFDLhfxccE4qUUWNTN589LrTK

MapReudce中常见join的方案的更多相关文章

  1. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  2. JavaScript中常见的数组操作函数及用法

    JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...

  3. OpenStack安装部署管理中常见问题解决方法

    一.网络问题-network 更多网络原理机制可以参考<OpenStack云平台的网络模式及其工作机制>. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...

  4. PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等

    页面导航: 首页 → 网络编程 → PHP编程 → php技巧 → 正文内容 PHP安全 PHP开发中常见的安全问题详解和解决方法(如Sql注入.CSRF.Xss.CC等) 作者: 字体:[增加 减小 ...

  5. js中常见的问题

    js中常见的问题 原文链接 1.js获取select标签选中的值 原生js var obj = document.getElementByIdx_x(”testSelect”); //定位id var ...

  6. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

  7. Python中常见字符串去除空格的方法总结

    Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...

  8. SQL中常见语句

    SQL中常见语句笔记: --替换字段中的回车符和换行符 ) ), '') --删除表命令 DROP TABLE [dbo].[MGoods_Test] --删除表中数据命令 DELETE FROM [ ...

  9. (转载)MySQL数据库的几种常见高可用方案

    转自: https://yq.aliyun.com/articles/74454   随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化. ...

随机推荐

  1. Devexpress datagrid动态添加显示指定列的gridView

    代码如下: public class DXGridControlHelper { /// <summary> /// 获取显示指定列的GridView /// </summary&g ...

  2. 【转】Styling And Animating SVGs With CSS

    原文转自:http://www.smashingmagazine.com/2014/11/03/styling-and-animating-svgs-with-css/?utm_source=CSS- ...

  3. spring AOP 实现事务和主从读写分离

    1 切面 是个类 2 切入点 3 连接点 4 通知 是个方法 5 配置文件 <?xml version="1.0" encoding="UTF-8"?&g ...

  4. (实用篇)PHP中单引号与双引号的区别分析

    在PHP中,我们可以使用单引号或者双引号来表示字符串.不过我们作为开发者,应该了解其中的区别.单引号与双引号对于定义字符一个是可以解析变量一个是会把变量直接输出来,同时单引号与双引号在字符处理上单引号 ...

  5. LintCode Singleton

    Singleton 3 大要素: 1.有private static的句柄(成员变量即field) 2. constructor 必须为private 3.有public static的getInst ...

  6. 第七课第三节,T语言流程语句(版本5.0)

    for语句 for和while语句一样,都是用来做循环操作的,只是他们的使用方法不一样 (注:关键字,for,end) 执行流程图解: 实例代码: for(var i=0;i<20;i++) / ...

  7. Sporadic IOException: Failed to persist config

    问题 在调用Jenkins API来更新Job的时候报错‘Sporadic IOException: Failed to persist config’. 原因 https://issues.jenk ...

  8. 033. asp.netWeb用户控件之二将页面转换成web控件和使用Web控件显示热点新闻

    访问Web用户控件的属性 ASP.NET提供的各种服务器控件都有其自身的属性和方法,程序开发人员可以灵活地使用服务器控件中的属性和方法开发程序.在用户控件中,程序开发人员也可以自行定义各种属性和方法, ...

  9. 合并excel-MergeExcel

    MergeExcel 将需要合并的excel放入该目录下,包含xls和xlsx 点击运行按钮: 输入包含多少列: 等待运行,完毕! 基于python编写,源码和exe于 TTyb

  10. CentOS 7 时间同步

    在做这个之前需要先搭建yum http://www.cnblogs.com/jw31/p/5955852.html 在做之前我们需要先安装ntp服务 yum install ntp -y vi /et ...