两表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. C#中的委托

    public delegate void SayHello(string name); class Program { static void Main(string[] args) { SayHel ...

  2. M2: XAML Controls(2)

    在前小节中,我们在Card程序的主界面中加入了简单的XAML控件, 本小节将在其基础上进行优化,使界面看上去更加美观.本小节用到了Grid Control, Border Control,以及XAML ...

  3. Pylot压力测试(linux)

    Pylot需要python2.5以上的版本,打开以后选择对应你的系统的版本,下载好之后双击安装. centOS5.5 系统版本python版本是2.4.3,所以要下载个2.5以上的. 1.下载Pyth ...

  4. pycharm安装

    license server http://idea.lanyus.com

  5. 《C与指针》第十章练习

    本章问题 1.成员和数组元素有什么区别? answer:Structure members can be all different types;they are accessed by name;a ...

  6. HDfs命令

    HDFS命令分为用户命令(dfs,fsck等),管理员命令(dfsadmn,namenode,datanode等) hdfs -ls -lsr 执行lsr 是递归显示 drwxr-xr-x -hado ...

  7. CE 文件读写操作

    写入字符到文件中: // TODO: 写字符到文件 // 参数: CString类型的文件名FileName;char *类型的数据内容;unsigned int类型内容长度 // 返回: 成功返回T ...

  8. docker2

    https://github.com/docker/distribution daocloud 数人云 时速云 http://jpetazzo.github.io/2014/06/23/docker- ...

  9. .NET微信自定义分享标题、缩略图、超链接及描述的设置方法

    前端Js引用: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> ...

  10. js传递参数中包含+号时的处理方法

    encodeURI(url).replace(/\+/g, '%2B') 例子: $scope.getAnesthesiawaystatistical = function (annual, anes ...