根据mapjoin的计算原理,MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。

mapjoin的应用场景如下:

1.有一个极小的表<1000行

2: 需要做不等值join的where操作(a.x < b.y 或者 a.x like b.y等,注:目前版本join下不支持不等值操作,不等值需加到where条件里)

如果把不等于写到where里会造成笛卡尔积,如果数据量很大,笛卡尔积的后果不可想象,速度可能慢的惊人!

根据mapjoin的计算原理,MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。

而且hive的where条件本身就是在map阶段进行的操作,所以在where里写入不等值比对的话,也不会造成额外负担。

如此看来,使用MAPJOIN开发的程序仅仅使用map一个过程就可以完成不等值join操作,效率还会有很大的提升。

案例讲解:

老板要显示会员每天的交易记录,没有记录的要显示0,数据库中没有交易的根本不会显示这条,怎么会显示为0呢,没办法,只能用会员每天汇总信息关联时间维表了。

测试数据请下载:会员每天交易信息汇总,16万左右数据: http://pan.baidu.com/s/1qWjp4ok

时间维表信息: 亲~ 自己构建吧。

create table hive_mapjoin (id string,dt string,amt double)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';

create table hive_dt (dt string);

load data local inpath '/lab/testdata/hive_mapjoin.txt' overwrite into table hive_mapjoin;

load data local inpath '/lab/testdata/hive_dt.txt' overwrite into table hive_dt;
  --无mapjoin

  create table hive_no_mapjoin as
  --求会员有交易以来的连续时间
  select f.id,f.dt, coalesce(k.amt,0.0) amt from(
  --求会员交易最小时间
  select a.id,t.dt from hive_dt t join (select id, min(dt) min_dt from hive_mapjoin group by id) a
  where t.dt>= a.min_dt) f
  left outer join hive_mapjoin k on f.dt = k.dt and f.id = k.id;


--有mapjoin
create table hive_ok_mapjoin as select f.id,f.dt, coalesce(k.amt,0.0) amt from(
--求会员有交易以来的连续时间
select /*+ mapjoin(t) */ a.id,t.dtfrom hive_dt t
join (
--求会员交易最小时间
select id,  min(dt) min_dt from hive_mapjoin group by id) a
where  t.dt>= a.min_dt) f
left outer join tmp.tst1 kon f.dt = k.dt and f.id = k.id;

测试结果:无mapjoin执行3分钟,有mapjoin执行2分钟

结果分析:样本数据太少,不到20万数据,小表数据不足200条,最终结果只有200多万。hive处理这点数据还是很轻松的,大家如果测试,建议数据量要大些,至少执行结果千万条以上才能看出效果

  • 小表在前,数据量不要大于200M (仅参考)
  • 大表不要太小,太小了意义不大

[Hive优化] 之 MapJoin的更多相关文章

  1. Hive 12、Hive优化

    要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1. ...

  2. Hive优化案例

    1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...

  3. 一起学Hive——总结常用的Hive优化技巧

    今天总结本人在使用Hive过程中的一些优化技巧,希望给大家带来帮助.Hive优化最体现程序员的技术能力,面试官在面试时最喜欢问的就是Hive的优化技巧. 技巧1.控制reducer数量 下面的内容是我 ...

  4. 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

    第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...

  5. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  6. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  7. 【转】Hive优化总结

    优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解Hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结.   长期观察hadoo ...

  8. hive 优化 (转)

    Hive优化 Hive优化目标 在有限的资源下,执行效率更高 常见问题 数据倾斜 map数设置 reduce数设置 其他 Hive执行 HQL --> Job --> Map/Reduce ...

  9. Hive(六)hive执行过程实例分析与hive优化策略

    一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...

随机推荐

  1. 常用Shell的路径

    #define REG_SHELL "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\S ...

  2. Git教程之创建版本库(2)

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  3. Zookeeper核心机制

    (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) Zookeeper是Hado ...

  4. .net 生成拼音码与五笔码

    首先加入配置文件: <?xml version="1.0" encoding="utf-8" ?> <CodeConfig> <S ...

  5. MyEclipse开发WebService教程

    . 创建一个 webService 工程. 2. 创建一个普通 Java 类   3. 创建 webService 服务端 HelloJaxwsDelegate.java 的源代码如下:   4. 导 ...

  6. 三个Timer

    System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer 关于这三者的区别,可以参见msdn     https:// ...

  7. fiddler for mac

    Fiddler 是一免费的web调试工具.并且兼容所有浏览器.系统和平台. Fiddler 是基于微软的 .Net 技术开发的,没办法直接在 Mac/Linux 下使用.本文介绍一些替代方案(这些方案 ...

  8. STL源码中map和set中key值不能修改的实现

    前言 最近正好刚刚看完,<stl源码剖析>这本书的map和set的源码部分.但是看完之后又突然发现,之前怎么没有注意到map和set容器中key不能修改是怎么实现的.故,特此整理如下. s ...

  9. Topcoder SRM 630 (500 floyed 暴力 _builtin_popcount())

    题意:给n个点,保证图联通,给点相连的距离,求一个最多的点,这些点之间的距离都是相同的. 分析: 下面的代码是我们房间第一的大神的,写的很简洁,我的思路和他的一样,但是我不知道错哪了. 思路是暴力枚举 ...

  10. QSettings读写注册表、配置文件

    简述 一般情况下,我们在开发软件过程中,都会缓存一些信息到本地,可以使用轻量级数据库sqlite,也可以操作注册表.读写配置文件. 关于QSettings的使用前面已经介绍过了,比较详细,见" ...