MapReudce中常见join的方案
两表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的方案的更多相关文章
- Redis 中常见的集群部署方案
Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...
- JavaScript中常见的数组操作函数及用法
JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...
- OpenStack安装部署管理中常见问题解决方法
一.网络问题-network 更多网络原理机制可以参考<OpenStack云平台的网络模式及其工作机制>. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...
- PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等
页面导航: 首页 → 网络编程 → PHP编程 → php技巧 → 正文内容 PHP安全 PHP开发中常见的安全问题详解和解决方法(如Sql注入.CSRF.Xss.CC等) 作者: 字体:[增加 减小 ...
- js中常见的问题
js中常见的问题 原文链接 1.js获取select标签选中的值 原生js var obj = document.getElementByIdx_x(”testSelect”); //定位id var ...
- SQL Server中INNER JOIN与子查询IN的性能测试
这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...
- Python中常见字符串去除空格的方法总结
Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...
- SQL中常见语句
SQL中常见语句笔记: --替换字段中的回车符和换行符 ) ), '') --删除表命令 DROP TABLE [dbo].[MGoods_Test] --删除表中数据命令 DELETE FROM [ ...
- (转载)MySQL数据库的几种常见高可用方案
转自: https://yq.aliyun.com/articles/74454 随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化. ...
随机推荐
- CentOS 基本设置
CentOS 基本设置 1.更改163源 在使用yum的时候,可能yum被锁,可用如下命令解锁:rm -rf /var/run/yum.id 2.编译安装开源软件 安装自己编译的开源软件一般都会在/u ...
- linux平台编译安装Poco C++
1.到官网下载poco-1.4.6p4-all.tar.gz,地址为http://pocoproject.org/download/index.html 2.同时下载说明文档 3.根据说明文档执行安装 ...
- 修改MySQL用户的密码
=====知道当前用户密码时===== P.S.:此文只针对windows下的用户密码更改. 1.使用进入MySQL的bin文件夹下: cd path\to\bin\mysqladmin.exe 2. ...
- ooize节点的属性控制
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:[version]"> & ...
- Oracle学习系列7
Oracle学习系列7 ************************************************************************************ 关联表 ...
- Mysql通信协议
Mysql四种通信协议(linux下本地连接的都是socket 其他都是tcp) 当连接mysql时,使用-h127.0.0.1时,linux与unix下的连接协议为socket协议,windows下 ...
- Spark往Elasticsearch读写数据
def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setAppName("DecisionTre ...
- 再看静态static及相关知识汇集
在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用.但有些时候,这样做却不是个明智的选择.C#中静态变量——它在类中类似全局变量,保存类 ...
- Win32编程:窗口类样式+窗口外观样式+窗口显示样式
1.窗口类样式WNDCLASS.style CS_VREDRAW 提供窗口位置变化事件和高度变化事件的处理程序,功能是重绘窗口 CS_HREDRAW 提供窗口位置变化事件和宽度变化事件的处理程序,功能 ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛
1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...