锁屏面试题百日百刷-Hive篇(九)

    锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题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; --分桶成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值