Hive⾯试题(持续更新中...)
maskman1.⼤表 join ⼩表产⽣的问题,怎么解决析构函数能不能重载
⼤表 join ⼩表,独钟爱 mapjoin
MapJoin 通常⽤于⼀个很⼩的表和⼀个⼤表进⾏join的场景,具体⼩表有多⼩,由参数hive.mapjoin.smalltable.filesize来决定,该参数表⽰⼩表的总⼤⼩,默认值25M
假设a表为⼀张⼤表,b为⼩表,并且vert.join=true,那么Hive在执⾏时候会⾃动转化为MapJoin
MapJoin简单说就是在Map阶段将⼩表数据从 HDFS 上读取到内存中的哈希表中,读完后将内存中的哈希表序列化为哈希表⽂件,在下⼀阶段,当 MapReduce 任务启动时,会将这个哈希表⽂件上传到 Hadoop 分布式缓存中,该缓存会将这些⽂件发送到每个 Mapper 的本地磁盘上。因此,所有 Mapper 都可以将此持久化的哈希表⽂件加载回内存,并像之前⼀样进⾏ Join。顺序扫描⼤表完成Join。减少昂贵的shuffle操作及reduce操作
MapJoin分为两个阶段:
通过MapReduce Local Task,将⼩表读⼊内存,⽣成HashTableFiles上传⾄Distributed Cache中,这⾥会HashTableFiles进⾏压缩
MapReduce Job在Map阶段,每个Mapper从Distributed Cache读取HashTableFiles到内存中,顺序扫描⼤表,在Map阶段直接进⾏Join,将数据传递给下⼀个MapReduce任务
join因为空值导致长尾(key为空值是⽤随机值代替)
join因为热点值导致长尾,也可以将热点数据和⾮热点数据分开处理,最后合并
2.UDF UDAF UDTF 区别
UDF操作作⽤于单个数据⾏,并且产⽣⼀个数据⾏作为输出。⼤多数函数都属于这⼀类(⽐如数学函数和字符串函数)
UDAF 接受多个输⼊数据⾏,并产⽣⼀个输出数据⾏。像COUNT和MAX这样的函数就是聚集函数
UDTF 操作作⽤于单个数据⾏,并且产⽣多个数据⾏,⼀个表作为输出
简单来说:
UDF : 返回对应值,⼀对⼀
UDAF:返回聚类值,多对⼀
UDTF:返回拆分值,⼀对多
3.hive有哪些保存元数据的⽅式,各有什么特点
内存数据库derby,安装⼩,但是数据存在内存,不稳定
mysql数据库,数据存储模式可以⾃⼰设置,持久化好,查看⽅便
4.hive内部表和外部表的区别以及各⾃使⽤场景
(1) hive内部表和外部表的区别
内部表:加载数据到hive所在的hdfs⽬录,删除时,元数据和数据⽂件都删除
外部表:不加载数据到hive所在的hdfs⽬录,删除时,只删除表结构。
这样外部表相对来说更加安全些,数据组织也更加灵活,⽅便共享源数据
(2) 什么时候使⽤内部表,什么时候使⽤外部表
每天采集的ng⽇志和埋点⽇志,在存储的时候建议使⽤外部表,因为⽇志数据是采集程序实时采集进来的,⼀旦被误删,恢复起来⾮常⿇烦。⽽且外部表⽅便数据的共享
抽取过来的业务数据,其实⽤外部表或者内部表问题都不⼤,就算被误删,恢复起来也是很快的,如果需要对数据内容和元数据进⾏紧凑的管理, 那还是建议使⽤内部表
在做统计分析时候⽤到的中间表,结果表可以使⽤内部表,因为这些数据不需要共享,使⽤内部表更为合适。并且很多时候结果分区表我们只需要保留最近3天的数据,⽤外部表的时候删除分区时⽆法删除数据
5. insert into 和 override write区别?
insert into:将数据写到表中
override write:覆盖之前的内容
6.hive的常⽤函数有哪些?
(1) 数学函数
round(double d)
floor(double d)
ceil(double d)
rand()
PI()
abs(double d)
(2) 集合函数
size(Map<K.V>)
map_keys(Map<K.V>)
map_values(Map<K.V>)
array_contains(Array, value)
freemarker判断list是否为空
sort_array(Array)
(3) 类型转换函数
cast(expr as )
(4) ⽇期函数
date_add
last_day
next_day
year(string date)
month(string date)
hour(string date)
(5) 条件函数
if(boolean testCondition, T valueTrue, T valueFalseOrNull)
isnull( a )
isnotnull ( a )
(6) 字符函数
concat(string|binary A, string|binary B…)
length(string A)
lower(string A) lcase(string A)
reverse(string A)
split(string str, string pat)
(7) 聚合函数
count(*)
sum(col)
avg(col)
min(col)
max(col)
淘宝教程学习之家(8) 表⽣成函数
explode(ARRAY array)
json_tuple(STRING jsonStr,p1p2,…,pn)
7.简单描述⼀下Hive的功能?⽤hive创建表有⼏种⽅式?
hive主要是做离线分析的
hive建表有三种⽅式:
直接建表法
查询建表法**(通过AS 查询语句完成建表:将⼦查询的结果存在新表⾥,有数据,**⼀般⽤于中间表)
like建表法(会创建结构完全相同的表,但是没有数据)
8.若在hive中建⽴分区仍不能优化查询效率,建表时如何优化
可以重新建表为分区分桶表
9.union all和union的区别
union 去重
union all 不去重
10.如何解决hive数据倾斜的问题
表现:任务进度长时间维持在99%(或100%),查看任务监控页⾯,发现只有少量(1个或⼏个)reduce⼦任务未完成。因为其处理的数据量和其他reduce差异过⼤
原因:某个reduce的数据输⼊量远远⼤于其他reduce数据的输⼊量
(1) SQL本⾝导致的倾斜
group by
如果是在group by中产⽣了数据倾斜,是否可以将group by的维度变得更细,如果没法变得更细,就可以在原分组key上添加随机数后分组聚合⼀次,然后对结果去掉随机数后再分组聚合
在join时,有⼤量为null的join key,则可以将null转成随机值,避免聚集
count(distinct)
数据库中视图的优点
情形:某特殊值过多
后果:处理此特殊值的 reduce 耗时;只有⼀个 reduce 任务
解决⽅式:count distinct 时,将值为空的情况单独处理,⽐如可以直接过滤空值的⾏,在最后结果中加 1。如果还有其他计算,需要进⾏ group by,可以先将值为空的记录单独处理,再和其他计算结果进⾏ union
不同数据类型关联产⽣数据倾斜
情形:⽐如⽤户表中 user_id 字段为 int,log 表中 user_id 字段既有 string 类型也有 int 类型。当按照 user_id 进⾏两个表的 Join 操作时。
后果:处理此特殊值的 reduce 耗时;只有⼀个 reduce 任务
默认的 Hash 操作会按 int 型的 id 来进⾏分配,这样会导致所有 string 类型 id 的记录都分配到⼀个 Reducer 中。
解决⽅式:把数字类型转换成字符串类型
select * from users a
left outer join logs b
on a.usr_id = cast(b.user_id as string)
mapjoin
(2) 业务数据本⾝的特性(存在热点key)
join的每路输⼊都⽐较⼤,且长尾是热点值导致的,可以对热点值和⾮热点值分别进⾏处理,再合并数据
(3) key本⾝分布不均
可以在key上加随机数,或者增加reduceTask数量
开启数据倾斜时负载均衡 upby.skewindata=true;
思想:就是先随机分发并处理,再按照 key group by 来分发处理
操作:当选项设定为 true,⽣成的查询计划会有两个 MRJob
第⼀个 MRJob 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 GroupBy Key 有可能被分发到不同的Reduce 中,从⽽达到负载均衡的⽬的
第⼆个 MRJob 再根据预处理的数据结果按照 GroupBy Key 分布到 Reduce 中(这个过程可以保证相同的原始 GroupBy Key 被分布到同⼀个 Reduce 中,最后完成最终的聚合操作
(4) 控制空值分布
将为空的 key 转变为字符串加随机数或纯随机数,将因空值⽽造成倾斜的数据分不到多个 Reducer
注:对于异常值如果不需要的话,最好是提前在 where 条件⾥过滤掉,这样可以使计算量⼤⼤减少
11.hive性能优化常⽤的⽅法
(1) Fetch抓取
Hive中对某些情况的查询可以不必使⽤MapReduce计算。例如:SELECT * FROM score;在这种情况下,Hive可以简单地读取score对应的存储⽬录下的⽂件,然后输出查询结果到控制台,通过设置hive.version参数为more,可以控制查询语句是否⾛MapReduce
(2) 本地模式
⼤多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理⼤数据集的。不过,有时Hive的输⼊数据量是⾮常⼩的。在这种情况下,为查询触发执⾏任务时消耗可能会⽐实际job的执⾏时间要多的多。对于⼤多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于⼩数据集,执⾏时间可以明显被缩短
⽤户可以通过设置de.local.auto的值为true,来让Hive在适当的时候⾃动启动这个优化
(3) MapJoin
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会在Reduce阶段完成join,容易发⽣数据倾斜。可以⽤MapJoin把⼩表全部加载到内存在map端进⾏join,避免reducer处理
开启MapJoin参数设置:
设置⾃动选择Mapjoin:set vert.join = true;
⼤表⼩表的阈值设置(默认25M以下认为是⼩表):set hive.mapjoin.smalltable.filesize=25123456;
(4) GroupBy
默认情况下,Map阶段同⼀Key数据分发给⼀个reduce,当⼀个key数据过⼤时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进⾏部分聚合,最后在Reduce端得出最终结果
开启Map端聚合参数设置:
a.是否在Map端进⾏聚合,默认为True
set hive.map.aggr = true;
b.在Map端进⾏聚合操作的条⽬数⽬
upby.mapaggr.checkinterval = 100000;
c.有数据倾斜的时候进⾏负载均衡(默认是false)
upby.skewindata = true;
(5) Count(distinct)
数据量⼩的时候⽆所谓,数据量⼤的情况下,由于COUNT DISTINCT操作需要⽤⼀个ReduceTask来完成,这⼀个Reduce需要处理的数据量太⼤,就会导致整个Job很难完成,⼀般COUNT DISTINCT使⽤先GROUP BY再COUNT的⽅式替换
select count(distinct s_id) from score;
select count(s_id) from (select id from score group by s_id) a;
虽然会多⽤⼀个Job来完成,但在数据量⼤的情况下,这个绝对是值得的
(6) 笛卡尔积
尽量避免笛卡尔积,即避免join的时候不加on条件,或者⽆效的on条件,Hive只能使⽤1个reducer来完成笛卡尔积
剩余查看Hive.pdfmysql面试题sql优化
12.简述delete,drop,truncate的区别
delet 删除数据
drop 删除表
truncate 摧毁表结构并重建

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。