阿里云大数据利器Maxcompute-使用mapjoin优化查询
摘要: small is beautiful,small is powerful
点此查看原文:http://click.aliyun.com/m/40815/
大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。
https://help.aliyun.com/document_detail/27800.html?spm=5176.7840267.6.539.po3IvS
主要有三种操作数据的方式SQL,UDF,MapReduce,了解hadoop的同学就比较熟悉这些东西了。
那么Maxcompute的SQL和标准SQL最大的区别就是在Maxcompute中SQL会被解析成MapReduce去执行,当然也可以直接去写MapReduce去计算数据,UDF就是当自带的一些sql引用的函数不能满足业务计算的时候,自己通过代码编写一个函数,sql执行的时候引用。
由此可见实际上底层的计算都是依靠MapReduce这个计算引擎去执行。首先了解下什么是MapReduce。一份数据很大的时候在MaxCompute上是分布式存储的,也就是会分开存放到很多服务器,当一个任务执行的时候会从这些数据所在的服务器上启动一个进程读取这些数据,进行计算等操作,还会启动一个进程把这些数据进行汇总分析并输出。那前者进程叫做Map,后者进程叫做Reduce,合起来叫MapReduce任务。
使用sql操作数据的时候,会经常用到join。比如select * from A a join B b on a.id=b.id,这句sql在转换成MapReduce任务执行的时候:
1,map任务读数据,并对两个表的数据打上不同的tag用来区分
2,reduce端接收打标记的数据,将不同标记的表数据相同关联字段的数据放在一起输出
假设有两个表,我们暂且叫做Big表和Small表,其中Big表数据量比较大,分布式存在n台实例服务器上,Small表存在于一台服务器就放下了。
首先MaxCompute会启动一些Map的进程(Map任务)去读取这些数据分别打上标记,Map的个数是由一个参数控制的这里暂时不解释了。注意对于读取Big表的每个Map任务有可能在其他服务器上,那么这时候就需要到数据所在的服务器上把数据拉过来,Small表也会启动一个或者几个map任务读取文件系统中的数据,读取完成后会到Reduce端接收数据进行关联,判断关联字段相等的就放在一起输出,达到关联效果。
我们可以看一个例子,我准备了一个相对大的表train_user_lt,5G大小,数据大概7亿条。
准备了一个比较小的表map_join_test,只有3条数据。
select a.* from train_user_lt a left outer join map_join_test b on a.user_id = b.user_id;
执行了这句sql,如图
这个执行的过程图是Maxcompute特有的可以帮助用户来查看任务执行的过程等叫做logview,是一个在ODPS Job提交后查看和Debug任务的工具https://help.aliyun.com/document_detail/27987.html
从图中可以看出分为三部分
1,大的表train_user_lt启动了39个map任务去读取数据707025259条
2,小的表启动一个map任务读取3条数据。
3,reduce阶段接收了3+707025259=707025262条数据,输出了707025259条数据,left outer join按照左边的大表输出。
但是看下消耗的时间是40分钟,这样来说算是很长的时间的。那么怎么优化提高速度呢,有没有一种比较方便,比较直接暴力的方式进行优化呢
那么本文的重点就来了–Mapjoin:
MAPJION会把小表全部读入内存中,把小表拷贝多份分发到大表数据所在实例上的内存里,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率会高很多。
使用的条件就是当一个大表和一个或多个小表做join时。SQL会将用户指定的小表全部加载到执行join操作的程序的内存中,从而加快join的执行速度。需要注意,在Maxcompute使用mapjoin时:
left outer join的左表必须是大表;
right outer join的右表必须是大表;
inner join左表或右表均可以作为大表;
full outer join不能使用mapjoin;
mapjoin支持小表为子查询;
使用mapjoin时需要引用小表或是子查询时,需要引用别名;
在mapjoin中,可以使用不等值连接或者使用or连接多个条件;
目前MaxCompute 在mapjoin中最多支持指定8张小表,否则报语法错误;
如果使用mapjoin,则所有小表占用的内存总和不得超过512MB。请注意由于MaxCompute 是压缩存储,因此小表在被加载到内存后,数据大小会急剧膨胀。此处的512MB限制是加载到内存后的空间大小;
多个表join时,最左边的两个表不能同时是mapjoin的表。
那么为什么说left outer join的左表必须是大表呢,
因为左表是大表的时候,会拿小表的全部数据和大表所在的实例服务器中的数据匹配一遍,刚好小表就在内存里。如果是左表是小表,那么需要把大表所有的数据拉过来跟小表匹配一遍,试想一下性能会如何。
来看下写法
select /* + mapjoin(b) */ a.* from train_user_lt a left outer join map_join_test b on a.user_id = b.user_id;
//就是在sql语句前加一个标记说这是mapjoin,把小表别名写在括号里
看下优化后的效果
任务变成了两个部分,map端直接读取数据和内存里的小表进行关联,然后输出,少了一步reduce。也就是说关联从reduce转到map端进行join,省去了reduce这一步,所以叫做:mapjoin。
看下执行时间1分钟20多秒。之前是40分钟。当然我这边测试是把两个比较极端的数据进行比较,所以效果比较明显。由此看来大表关联小表的时候可以使用mapjoin进行优化查询。
那么mapjoin除了优化性能,还可以干什么呢。
MaxCompute SQL不支持支持在普通join的on条件中使用不等值表达式、or ,like等逻辑等复杂的join条件,但是在mapjoin中可以进行如上操作。例如
select /*+ mapjoin(a) */a.total_price,b.total_pricefrom shop a join sale_detail bon a.total_price < b.total_price or a.total_price + b.total_price < 500;
总结:mapjoin看似很小的操作变化,实际上可以带来很大效率提升,另外还可以解决一些不等关联的业务场景。
正如马云经常说的一句话:
small is beautiful,small is powerful !
阿里云大数据利器Maxcompute-使用mapjoin优化查询相关推荐
- 阿里云大数据利器Maxcompute学习之-假如你使用过hive
摘要: 如果您是一个大数据开发工程师并且使用过hadoop的hive框架,那么恭喜您,阿里云的大数据计算服务-Maxcompute,您已经会了90%.这篇文章就来简单对比下Maxcompute和hiv ...
- “阿里云大数据技术实战训练营”江苏省大学生万人计划学术冬令营活动成功举行...
2019年1月14日-23日,由江苏省教育厅主办,阿里云.常州大学承办的"阿里云大数据技术实战训练营"(以下简称"冬令营")江苏省大学生万人计划学术冬令营在常州 ...
- 阿里云大数据工程师ACA认证考试大纲
阿里云大数据工程师ACA认证考试大纲 认证介绍: 阿里云大数据工程师ACA认证(Alibaba Cloud Certified Associate-Big Data) 是面向学生.大数据技术入门人员. ...
- 阿里云大数据计算服务 - MaxCompute (原名 ODPS)
MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务.去年MaxCompute 做了哪些工作,这些工作背后的原因是什么?大数据市场进入 ...
- 阿里云大数据计算服务MaxCompute(下篇)
关于阿里云大数据计算服务MaxCompute的详细内容: 阿里云大数据计算服务MaxCompute使用教程 (MaxCompute(原ODPS)是一项大数据计算服务,它能提供快速.完全托管的PB级数据 ...
- 阿里云大数据计算服务MaxCompute(上篇)
关于阿里云大数据计算服务MaxCompute的详细内容: 阿里云大数据计算服务MaxCompute使用教程 (MaxCompute(原ODPS)是一项大数据计算服务,它能提供快速.完全托管的PB级数据 ...
- 阿里云大数据计算服务MaxCompute使用教程
MaxCompute简介 大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式 ...
- 阿里云大数据计算服务MaxCompute
阿里云大数据计算服务MaxCompute 大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的TB/PB级数据仓库解决方案. 当今社会数据收集手段不断丰富,行业数据大量积累,数据 ...
- 阿里云大数据-maxcompute
一.先言 网址:https://ide2-cn-beijing.data.aliyun.com/ Maxcompute : 是阿里云大数据一个应用,包含表数据,di,逻辑文件.这个应用下的表数据来源有 ...
最新文章
- LeetCode 1119. Remove Vowels from a String--C++,Java,Python解法
- oracle 前端ui框架,Layui(前端UI框架) 2.6.4 官方最新版
- 图解VC++6.0和ACE 5.4 开发入门
- Anaconda创建环境、删除环境、激活环境、退出环境
- python递归列文件_python-Bash:从最大列递归地向文件写入一行
- 创意产品 分析_使用联合分析来发展创意
- Swift4.0复习特性、编译标志和检查API的可用性
- 使用正则表达式从字符串中提取email
- 10个最值得Python新人练手的有趣项目
- 敏捷(AM):TDD(Test Driven Development)实践与变化--TAD(Test Assist Development)
- 《linux核心应用命令速查》连载二:lastcomm:显示以前使用过的命令的信息
- Java对象转Map,Map转对象
- 【微信H5开发】the permission value is offline verifying
- 基于R16标准的5G电力高精度授时解决方案PTP授时方案
- 德玛西亚皇子背景故事
- 1079 延迟的回文数 (20 分) java题解
- Android 热修复原理解析
- 数据可视化查看2021全国各省份的GDP
- 从一台 Windows 10 上共享文件夹到Docker中的Volume卷
- Python+Vue计算机毕业设计安达驾校管理系统62e2u(源码+程序+LW+部署)
热门文章
- xml建模包括以下_为什么要进行建模仿真?
- MySQL故障检测_检测MySQL的表的故障的方法
- java虚拟机规范 51cto_java虚拟机
- php开源mvccms_轻松理解MYSQL MVCC 实现机制
- 用友 无法正确解析服务器,用友T3软件登陆软件时提示:“可能无法正确解析服务器名称或者相应的端口被禁用,请尝试输入服务器的IP地址”?...
- 光电转换模块_光模块:PIN光电二极管和APD光电二极管
- 如何看懂串口通讯协议_一文看懂PLC的通讯方式——AB系统(一)
- winform教_电脑绝技教你22天学精Csharp之第十五天winform应用程序补充5
- where里能用max吗_超市里四五元钱的速冻饺子能买吗?
- java super用法_Java基础面试题汇总