1.小表在前,大表在后,如果表很小就用mapjoin
写JOIN的时候,将小表写在JOIN的前面,这样HIVE就会将小表载入内存,然后扫描大表。
如果表足够的小,就使用map join。
2.设定map的并发数,保证一次map结束;根据输入数据量估计reduce的tasks数目,并根据运行中间数据情况修正;
http://superlxw1234.iteye.com/blog/1582880
3.临时表能提升计算速度
在处理海量数据时我们通常会对很多大表进行操作,基于Hadoop现在的局限性,不能像分布式并行数据库那样很好地在分布式环境利用数据局部性,Hadoop对于大表只能全表扫描并筛选数据,而每一次对大表的扫描都是苦不堪言的。(最后知道真相的我眼泪掉下来。。。)所以我们会用到在编码中经常用到的重构技巧,提取公共变量,在Hive中,就是创建临时表。
4.Union all在数据对齐中的使用;
不支持 top level,以及各个select字段名称、属性必须严格一致
5.Hive支持跨数据库查询
比如database arch的table1和database algo的table2 进行joinA: 可以,只要有用户有这两张表的select权限即可,用户需要用“database.table”的方式来指定数据库下的表
6.Hive支持本地执行模式
当数据量小的时候,本地执行比提交到集群上执行效率提升很大
set hive.exec.mode.local.auto=true(默认false)
当一个job满足如下条件才能真正使用本地模式:
- job的输入数据大小必须小于参数hive.exec.mode.local.auto.inputbytes.max(默认值128MB)
- job的map处理的文件数大于参数hive.exec.mode.local.auto.input.files.max(默认值4)
- job的reduce数必须为0或者1,不管是用户设置的还是系统推测出来的
用参数hive.mapred.local.mem(默认0)来设置local mode下mapper和reducer task jvm heap size
7.NULL和数字相加的问题
sum(t.shop_gmvcount + t.gmvcount_new + t.auc_shop_gmvcount + t.spu_gmv_cnt) gmv_cnt,这样的统计结果,当t.t.shop_gmvcount为null时,即使后面的t.gmvcount_new 不为null,那么总计的结果这个计算仍然是null;修改的方法是:采用sum(coalesce(t.shop_gmvcount,cast(0 as bigint)) + coalesce(t.gmvcount_new,cast(0 as bigint))这样的方式,coalesce函数类似于oracle数据库里面的nvl。
参考文章:
Hive 在多维统计分析中的应用 & 技巧总结 | |
hive本地mr | |
hive优化之——控制hive任务中的map数和reduce数 | |
Hive Tips |