hive中reduce类函数说明
order by
需要reduce操作,且 只有一个reduce,与配置无关。 数据量很大时,慎用。
group by
使用了reduce操作, 受限于reduce数量,设置reduce参数 mapred.reduce.tasks
输出文件个数与reduce数相同
数据倾斜,优化参数 hive.groupby.skewindata为true,会启动一个优化程序,避免数据倾斜。
left semi join
类似 exists。即查找a表中的数据, 是否在b表中存在,找出存在的数据。
mapjoin
在map端完成join操作,不需要用reduce,基于内存做join,属于优化操作,其中使用了分布式缓存技术。
mapjoin顾名思义,就是在map端完成join操作,把小数据集分发到map的每台机器上去做join,避免shuffle操作
distribute by与group by对比
都是按key值划分数据
都使用reduce操作
**唯一不同的是**distribute by只是单纯的分散数据,而group by把相同key的数据聚集到一起,后续必须是聚合操作。
distribute by也是存在数据倾斜问题的,热点key会被分布到个别reduce节点上
order by与sort by 对比
order by是全局排序
sort by只是确保每个reduce上面输出的数据有序。如果只有一个reduce时,和order by作用一样。
cluster by
把有相同值的数据聚集到一起,并排序。
效果等价于distribute by col sort by col
cluster by col <==> distribute by col sort by col
union all
多个表的数据合并成一个表,hive不支持union
是不是map数越多越好?
答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,
而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。
而且,同时可执行的map数是受限的。
1.Hive自己如何确定reduce数:
reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1)
即,如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;
如:select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;
总大小为9G多,因此这句有10个reduce
2.调整reduce个数方法一:
调整hive.exec.reducers.bytes.per.reducer参数的值;
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
这次有20个reduce
3.调整reduce个数方法二;
set mapred.reduce.tasks = 15;
这次有15个reduce
4.reduce个数并不是越多越好;
同map一样,启动和初始化reduce也会消耗时间和资源;
另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
5.什么情况下只有一个reduce;
很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;
其实只有一个reduce任务的情况,除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外,还有以下原因:
a)没有group by的汇总,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;
写成 select count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04';
这点非常常见,希望大家尽量改写。
b)用了order by,全局排序
c)有笛卡尔积
通常这些情况下,除了找办法来变通和避免,我暂时没有什么好的办法,因为这些操作都是全局的,所以hadoop不得不用一个reduce去完成;
同样的,在设置reduce个数的时候也需要考虑这两个原则:使大数据量利用合适的reduce数;使单个reduce任务处理合适的数据量;
3.怎样写exist/in子句?
Hive不支持where子句中的子查询,SQL常用的exist in子句需要改写。这一改写相对简单。考虑以下SQL查询语句:
SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B);
可以改写为
SELECT a.key, a.value FROM a LEFT OUTER JOIN b ON (a.key = b.key) WHERE b.key <> NULL;
一个更高效的实现是利用left semi join改写为:
SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key);
1、如何合并小文件,减少map数?
如果一个表中的map数特别多,可能是由于文件个数特别多,而且文件特别小照成的,可以进行如下操作,合并文件,:
set mapred.max.split.size=100000000; // 100M
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; // 合并小文件
2、如何适当的增加map数?distribute by
如果表A只有一个文件,大小为120M,包含几千万记录,可以考虑用多个map任务完成
set mapred.reduce.tasks=10;
create table a_1 as
select * from a
distribute by rand(123); //将a表的记录,随机的分散到包含10个文件的a_1表中
3.如果设计和使用bucket
所用场合:对某一列进行分区,比如对用户ID进行分区,例如:
CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING)
PARTITIONED BY (dt STRING)
CLUSTERED BY (user_id) INTO 96 BUCKETS; // 按照日期分区后,再按照user_id把日志放在96个篮子里。
4.count(distinct)
当count distinct 的记录非常多的时候,设置以下两个参数:
hive> hive.map.aggr = true — 在map端进行combine
hive> set hive.groupby.skewindata=true;
hive> select count (distinct gid) from cookie_label_summary where i_date=20130924;
5.group by
map端聚合,提前一部分计算:hive.map.aggr = true 同时设置间隔:hive.groupby.mapaggr.checkinterval
均衡处理:hive.groupby.skewindata
这是针对数据倾斜的,设为ture的时候,任务的reduce会把原来一个job拆分成两个,第一个的job中reduce处理处理不同的随即分发过来的key的数据,生成中间结果,再由最后一个综合处理。
(解决group by的数据倾斜主流就是设置这个参数,相当于先用一组随机key先汇总一次,然后去掉随机数继续汇总,注意这个参数是专门为group by设计的)
6.order by, sort by ,distribute by, cluster by
order by VS Sort by:
order by是在全局的排序,只用一个reduce去跑,所以在set hive.mapred.mode=strict 模式下,order by 必须limit,否则报错。Sort by只保证同一个reduce下排序正确。
Distribute by with sort by:
Distribute by 是按指定的列把map 输出结果分配到reduce里(经常用来增加map数)。所以经常和sort by 来实现对某一字段的相同值分配到同一个reduce排序。
Cluster by 实现了Distribute by+ sort by 的功能
先cluser by,最后再order by,真的会提供整体排序效率吗?
未实验验证,从原来上看是的,先在map端局部排序
所以面试官问order by造成的数据倾斜如何解决时,应该就是要回答这一点,先distribute在map端就把数据倾斜解决掉,然后map端排序
hive中reduce类函数说明相关推荐
- 在Hive中执行DDL之类的SQL语句时遇到的一个问题
在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...
- HIVE中的表以及语法
2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...
- 关于hive中Map join 时大表left join小表的问题
在hive中,(启用Map join时) 大表left join小表,加载从右向左,所以小表会加载进内存,存储成map键值对,通过大表驱动小表,来进行join,即大表中的join字段作为key 来获取 ...
- 3.2-3.3 Hive中常见的数据压缩
一.数据压缩 1. 数据压缩数据量小*本地磁盘,IO*减少网络IOHadoop作业通常是IO绑定的; 压缩减少了跨网络传输的数据的大小; 通过简单地启用压缩,可以提高总体作业性能; 要压缩的数据必须支 ...
- hive中如何控制mapper的数量
参考文档:https://www.cnblogs.com/1130136248wlxk/articles/5352154.html 1. 决定map的数据的决定因素有: input的文件总个数,inp ...
- mysql和hive的sql语句,hive中使用sql语句需要注意的事项
最近在熟悉hive,使用hive中的sql语句过程中出现了一些问题. 1,hive中的insert into语句 hive> select * from t_hive2; OK 1623 611 ...
- 061 hive中的三种join与数据倾斜
一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...
- Hive中JOIN的使用入门
Hive中join的用法 Hive中Join的通常使用有以下几种: inner join 等值连接 left join right join full join left semi join cr ...
- Hive中视图机制的初步使用及分析
作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/04/29/hiv ...
- hive 中某个字段等于0_快速了解hive
作者丨HappyMint 文章选摘:大数据与人工智能 这是作者的第7篇文章 本文主要针对从事大数据分析和架构相关工作,需要与hive打交道但目前对hive还没有进行深层次了解的小伙伴,希望本文会让你对 ...
最新文章
- 基于matlab异步电机 s函数,建立电机状态方程的S 函数和仿真模)基于MATLAB的无刷双馈电机建模与仿真...
- TortoiseSVN操作
- ahjesus解决win下U盘无法写入的问题
- jzoj2941-贿赂【数学期望,dfs】
- 哇!Flash影片剪辑导出静止的问题被解决了!
- 阿里撬得动“印度版”抖音吗?
- ArrayList 与 LinkedList 插入、查询效率测试
- bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)
- VS2012编译文件报错——error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
- Silverlight实用窍门系列:50.InkPresenter涂鸦板的基本使用,以及将效果保存为Png图片【附带源码实例】...
- kaldi在java中运行_Kaldi语音识别CVTE模型实战
- 购买大米云主机并配置php环境搭建企业网站
- 量子计算机优点概括,量子计算机简介
- 【论文解读 WWW 2019 | FBMA】Event Detection using Hierarchical Multi-Aspect Attention
- linux下redis设置密码登录(简单易懂)
- teambition桌面客户端的妙用(绝密)
- Android webview加载天猫店铺时会报net::ERR_UNKNOWN_URL_SCHEME;
- c语言推箱子游戏实习报告,用C语言编写推箱子游戏
- 服务程序占用服务器内存过大处理
- 热成像测温的原理是什么呢?你知道吗?
热门文章
- Gradle's dependency cache may be corrupt (this sometimes occurs after a net错误解决
- 平淡人生(一)- 360发展历程及人物杂记
- kafka auto.offset.reset / latest / earliest 详解
- python实验总结与分析_【利用python进行数据分析】利用初中物理实验 培养学生发散思维...
- 股市崩盘时,手中的股票期权 option 是如何让你倾家荡产的
- 计算机显示错误屏幕,如何解决显示器分辨率错误
- IntelCPU后缀含义
- 码住!Elsevier-最全清样/校样(Proof)处理流程
- 游戏运行报错Exception EAccessViolation in module
- Cask ‘libreoffice-still‘ definition is invalid .....unknown or unsupported macOS version: :mavericks