锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步!接下来的是今日的面试题:
1.Hive中使用什么代替in查询?
在Hive 0.13版本之前,通过left outer join实现SQL中的in查询,0.13版本之后,Hive已经支持in查询。
2.所有的Hive任务都会有MapReduce的执行吗?
不是,从Hive0.10.0版本开始,对于简单的不需要聚合的类似SELECT <col> from <table> LIMIT n语句,不需要起MapReduce job,直接通过Fetch task获取数据。
3.Hive的函数:UDF、UDAF、UDTF的区别?
UDF: 单行进入,单行输出
UDAF: 多行进入,单行输出
UDTF: 单行输入,多行输出
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)
一进多出
如lateral view explore()
4.Hive自定义UDF函数的流程?
1)写一个类继承(org.apache.hadoop.hive.ql.)UDF类;
2)覆盖方法evaluate();
3)打JAR包;
4)通过hive命令将JAR添加到Hive的类路径:
hive> add jar /home/ubuntu/ToDate.jar;
5)注册函数:
hive> create temporary function xxx as 'XXX';
6)使用函数;
7)[可选] drop临时函数;
5.拉链表是什么,怎么使用?
拉链表就是之前我们讲过的SCD2,它的优点是即满足了反应数据的历史状态,又能在最大程度上节省存储。
拉链表的实现需要在原始字段基础上增加两个新字段:
l start_time(表示该条记录的生命周期开始时间——周期快照时的状态)
l end_time(该条记录的生命周期结束时间)
拉链表实现步骤:
1. 建立增量数据临时表update;
2. 抽取昨日增量数据到update表;
3. 建立临时合并表tmp;
4. 合并昨日增量数据与历史数据,将重复的旧数据end_time更新为昨日,也就是从今天起不再生效;新数据end_time改为’9999-12-31’,也就是当前有效;合并后的数据写入到tmp表;
5. 将临时表的数据,覆盖到拉链表中;
6. 下次抽取需要重建update表和tmp表。
查询拉链表数据时,可以通过start_time和end_time查询出快照数据。
6.Hive为什么要分桶?
(1)获得更高的查询处理效率
在分区数量过于庞大以至于可能导致文件系统崩溃时,或数据集找不到合理的分区字段时,我们就需要使用分桶来解决问题了。
分区中的数据可以被进一步拆分成桶,不同于分区对列直接进行拆分,桶往往使用列的哈希值对数据打散,并分发到各个不同的桶中从而完成数据的分桶过程。
注意,hive使用对分桶所用的值进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。
如果另外一个表也按照同样的规则分成了一个个小文件。两个表join的时候,就不必要扫描整个表,只需要匹配相同分桶的数据即可,从而提升效率。
在数据量足够大的情况下,分桶比分区有更高的查询效率。
(2)数据采样
在真实的大数据分析过程中,由于数据量较大,开发和自测的过程比较慢,严重影响系统的开发进度。此时就可以使用分桶来进行数据采样。采样使用的是一个具有代表性的查询结果而不是全部结果,通过对采样数据的分析,来达到快速开发和自测的目的,节省大量的研发成本。
(3)分桶和分区的区别
1. 分桶和分区两者不干扰,可以把分区表进一步分桶;
2. 分桶对数据的处理比分区更加细粒度化:分区针对的是数据的存储路径;分桶针对的
是数据文件;
3. 分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分
割的,容易造成数据倾斜。
(4) 文本数据处理
注意:对于分桶表,不能使用load data的方式进行数据插入操作,因为load data导入的数据不会有分桶结构。
如何避免针对桶表使用load data插入数据的误操作呢?
--限制对桶表进行load操作
set hive.strict.checks.bucketing = true;
也可以在CM的hive配置项中修改此配置,当针对桶表执行load data操作时会报错。
那么对于文本数据如何处理呢?
(1. 先创建临时表,通过load data将txt文本导入临时表。
--创建临时表
create table temp_buck(id int, name string) row format delimited fields terminated by '\t'; --导入数据
load data local inpath '/tools/test_buck.txt' into table temp_buck;
(2. 使用insert select语句间接的把数据从临时表导入到分桶表。
--启用桶表
set hive.enforce.bucketing=true; --限制对桶表进行load操作
set hive.strict.checks.bucketing = true; --insert select
insert into table test_buck select id, name from temp_buck; --分桶成功