Hive面试题

介绍下Hive?

(1)Hive是基于 Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能(HQL),Hive本质是将SQL转换为 MapReduce的任务进行运算。
(2)Hive可以通过JDBC、ODBC 等客户端进行访问。Hive的元数据保存在数据库中,元数据信息包含表名,列名,分区等,默认数据库是Derby,不支持多客户端访问,可以将其改为MySQL,支持多客户端访问。
(3)Hive内部执行流程:解析器(解析SQL语句)、编译器(把SQL语句编译成MapReduce程序)、优化器(优化MapReduce程序)、执行器(将MapReduce程序运行的结果提交到HDFS)

Hive内部表、外部表、分区表、分桶表的区别内部表:

内部表:
Hive默认创建的表都是管理表,也称内部表,。
管理表不共享数据。删除管理表时,会删除管理表中的数据和元数据信息。

外部表:
当数据需要被共享时,可以创建外部表。
删除该表并不会删除掉原始数据,删除的是表的元数据。

分区表:
分区表使用的是表外字段,需要指定字段类型,并通过关键字partitioned by声明

分桶表:
分桶使用的是表内字段,已经知道字段类型,不需要再指定。通过关键字 clustered by声明

Order By,Sort By,Distrbute By,Cluster By的区别

Order By(全局排序)
Order by 会对输入做全局排序,因此只有一个reduce,所以当输入的数据规模较大时,会导致计算的时间较长。在Hive严格模式下,使用order by必须指定limit

Sort By(每个MapReduce排序)
sort by并不是全局排序,其在数据进入reducer前完成排序, sort by只保证每个reducer的输出有序,不保证全局有序。不受hive严格模式影响

Distrbute By(每个分区排序)
distribute by 和group by
都是按照key值划分数据
都是使用reduce操作
唯一不同,distribute by 只是单纯的分散数据,而group by 把相同key的数据聚集到一起,后续必须是聚合操作

Cluster By
当 distribute by 和 sorts by字段相同时,可以使用 cluster by 方式代替。cluster by除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是 升序 排序,不能像distribute by 一样去指定排序的规则为 ASC 或者 DESC 。

Hive SQL语句的执行顺序

“select from where group by having order by” 的执行顺序
mysql 语句执行顺序:
from… where…group by… having… select … order by… limit …
hive 语句执行顺序:
from … where … select … group by … having … order by … limit …

如何做 Hive优化

MapJoin
大表join小表时,可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

行列过滤
列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

设置map、reduce个数合理

小文件进行合并

开启map端combiner(不影响最终业务逻辑)

Hive数据倾斜如何定位 + 怎么解决?

最容易出现数据倾斜的就是reduce阶段,因为map到reduce会经过shuffle阶段,在shuffle中会默认按照key进行hash,如果相同的key过多,那么hash的结果就是大量相同的key进入到同一个reduce中,导致数据倾斜。Map端当然也可能出现数据倾斜问题,比如说一个GZIP压缩的大文件被map读取,那么map阶段就发生了数据倾斜。

举个例子:
(1)实际业务中有些大量的null值或者一些无意义的数据参与到计算作业中,表中有大量的null值,如果表之间进行join操作,就会有shuffle产生,这样所有的null值都会被分配到一个reduce中,必然产生数据倾斜。
这种情况可以不让null值参加join操作,或者给null加随机值,这样hash结果不一样就不会进入同一reduce。
(2)对于两个表join,表a中需要join的字段key为int,表b中key字段既有string类型也有int类型。当按照key进行两个表的join操作时,默认的Hash操作会按int型的id来进行分配,这样所有的string类型都被分配成同一个id,结果就是所有的string类型的字段进入到一个reduce中,引发数据倾斜。
这种可以将类型全部变为string,hash时就按照string类型分配了
(3)对于不可拆分大文件引发的数据倾斜,那就尽量使用支持分割的压缩算法zip
(4)两表进行join时,如果表连接的键存在倾斜,那么shuffle阶段就会产生数据倾斜,通常解决办法就是使用map join,比较适用于小表join大表的场景,将小表放到map内存中,避免shuffle。

倾斜原因:
1、 key的分布不均匀或者说某些key太集中
2、 业务数据自身的特性,例如不同数据类型关联产生数据倾斜
3、 SQL语句导致的数据倾斜

如何解决?

  1. 开启map端combiner(不影响最终业务逻辑)

  2. 参数调节,开启Hive中数据倾斜时负载均衡

  3. 控制空值分布,将为空的key转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分配到多个Reducer

  4. 调整SQL语句:

    • 在join时,选择key分布均匀的表作为驱动表;
    • 大小表join时,使用map join将小表加载到内存中,在map端完成reduce。
    • 大表join大表时,把空值的key变为一个随机数,把倾斜的数据分到不同的reduce上,由于null关联不上,处理后不影响最终结果

介绍下平时常用的函数?

行转列函数:
Concat(str1,str2,str3)如果有一个参数为null,则返回null
Concat(aaa, ‘ ’ , b b b ) a a a ’, bbb) aaa ,bbb)aaabbb
Concat_ws(分隔符,str…),分隔符为null,返回null,拼接字符为null,就忽略

列转行函数:
炸裂函数explode(col),可以将map或者array拆成多行
LATERAL VIEW
LATERAL VIEW 可以和explode联合使用,将一行数据拆成多行,并且做聚合。

窗口函数:
Rank:排序,相同的序号一样,但总数不变,所以他可能有序号跳的情况
Row_number:顺序记录,1 2 3
Dense_rank:相同的序号一样,但会变少,不会跳

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TigRer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值