Hive面试简单26问

1. hadoop中两个⼤表实现join的操作,简单描述。

(1)Hive中可以通过分区来减少数据量;

(2)还可以通过优化HQL语句,⽐如只查询需要的字段,尽量避免全表、全字段查询;

2. Hive中存放是什么?

表。 存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的⽂ 件,HQL就是⽤sql语法来写的mr程序。

3. Hive与关系型数据库的关系?

没有关系,hive是数据仓库,不能和数据库⼀样进⾏实时的CURD操作。 是⼀次写⼊多次读取的操作,可以看成是ETL⼯具。

4. Hive中的排序关键字有哪些?

sort by ,order by ,cluster by ,distribute by

(1)sort by :不是全局排序,其在数据进⼊reducer前完成排序

(2)order by :会对输⼊做全局排序,因此只有⼀个reducer(多个reducer⽆法保证全局有序).只有⼀个reducer,会导致当输⼊规模较⼤时,需要较⻓的计算时间。

(3)cluster by : 当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort

(4)distribute by :按照指定的字段对数据进⾏划分输出到不同的reduce中

5. ⼤表和⼩表join

Map side join。将⼩表存⼊内存中,将⼩表复制多份,让每个map task内存中保留⼀份(⽐如存放到hash table中),这样只需要扫描⼤表。对于⼤表中的每⼀条记录key/value,在hash table中查找是否有相同的key,如果有,则连接后输出即可。

6. 数据清洗怎么做的?怎么⽤spark做数据清洗

数据清洗的⽬的是为了保证数据质量,包括数据的完整性、唯⼀性、⼀致性、合法性和权威性。数据清洗的结果是对各种脏数据进⾏对应的处理⽅式,从⽽得到标准的、⼲净的、连续的数据,提供给数据统计和数据挖掘使⽤。

  1. 解决数据的完整性问题:(1) 通过其他信息不全;(2) 通过前后数据不全;(3) 如果实在⽆法不全,虽然可惜,但是还是要剔除掉进⾏统计。但是没必要删除,后续其他分析可能还需要。
  2. 解决数据的唯⼀性问题: (1) 根据主键进⾏去除,去除重复数据; (2) 制定⼀系列规则,保证根据某种规则下只保存⼀条数据。
  3. 解决数据权威性的问题:(1)选择最权威的数据作为统计和挖掘。
  4. 解决合法性的问题:(1)设定判定规则,通过特定的规则来判断字段或者值来确定数据是否需要被清洗。

7. Hadoop中⼆次排序怎么做?

在hadoop中⼀般都是按照key进⾏排序的,但是有时候还需要按照value进⾏排序。有两种办法进⾏⼆次排序:buffer and int memory sort和value-to-key conversion。

(1)Buffer and in memory sort主要是在reduce()函数中,将每个key对应的value值保存下 来,进⾏排序。但是缺点在于可能会出现out of memory。

(2)Value-to-key conversion主要思想是将key和value拼接成⼀个组合key,然后进⾏排序,这样reduce()函数获取的结果就实现了先按照key排序,然后按照value进⾏排序。需要注意的是,⽤户需要⾃⼰实现paritioner,以便只按照key进⾏数据划分。

8. hadoop常见的join操作?

(1) reduce side join:是最简单的join操作,主要是在reduce端进⾏join操作;

(2) Map side join:之所以存在reduce side join,是因为在map端不能获得需要连接的全部的字段。Reduce side join⽐较低效,因为shuffle传输数据需要消耗⼤量的性能。

(3) Semijoin:半连接,对于reduce side join,跨机器的数据传输量特别⼤,成为join的⼀个瓶颈。如果能在map端过滤掉不会参加join的数据,那么可以⼤⼤节省⽹络IO。

9. hive优化有哪些?

(1) 数据存储及压缩。针对hive中表的存储格式通常有orc和parquet,压缩格式⼀般使⽤snappy。相⽐与textfile格式表,orc占有更少的存储。因为hive底层使⽤MR计算架构,数据流是hdfs到磁盘再到hdfs,⽽且会有很多次,所以使⽤orc数据格式和snappy压缩策略可以降低IO读写,还能降低⽹络传输量,这样在⼀定程度上可以节省存储,还能提升hql任务执⾏效率;

(2) 通过调参优化。并⾏执⾏,调节parallel参数;调节jvm参数,重⽤jvm;设置map、reduce的参数;开启strict mode模式;关闭推测执⾏设置。

(3) 有效地减⼩数据集将⼤表拆分成⼦表;结合使⽤外部表和分区表。

(4) SQL优化⼤表对⼤表:尽量减少数据集,可以通过分区表,避免扫描全表或者全字段;⼤表对⼩表:设置⾃动识别⼩表,将⼩表放⼊内存中去执⾏。

10. 分析函数?

row_number() over(partition by regionX order by nameX desc) as tn 
1 93;
2 90;
3 90 
排名是连续的,相同的分数会有排名先后,前100名只有100个
rank() over(partiition by regionX order by nameX desc) as tn 
1 93;
2 90;
2 90;
4 89 
排名不是连续的,相同的分数是同名次,前100名只有100个
dense_rank() over() 
1 93;
2 90;
2 90;
3 89
排名是连续的,相同的分数是同名次,前100名可能多于100个

11. 分析下hive数据倾斜问题,有什么解决⽅案?

倾斜原因: map输出数据按Key Hash分配到reduce中,由于key分布不均匀、或者业务数据本身的特点。等原因造成的reduce上的数据量差异过⼤。(1)key分布不均匀

(2)业务数据本身的特性

(3)SQL语句造成数据倾斜

解决⽅案:(1)参数调节:

hive.map.aggr=true
hive.groupby.skewindata=true

有数据倾斜的时候进⾏负载均衡,当选项设定为true,⽣成的查询计划会有两个MR Job。第⼀个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同GroupBy Key有可能被分发到不同的Reduce中,从⽽达到负载均衡的⽬的;第⼆个MR Job在根据预处理的数据结果按照Group By Key 分布到Reduce中(这个过程可以保证相同的 Group By Key 被分布到同⼀个Reduce中),最后完成最终的聚合操作。(2)SQL语句调节: 1)选⽤join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变⼩的效果。

2)⼤⼩表Join: 使⽤map join让⼩的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。

3)⼤表Join⼤表:把空值的Key变成⼀个字符串加上⼀个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。

4)count distinct⼤量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不⽤处理,直接过滤,在做后结果中加1。如果还有其他计算,需要进⾏group by,可以先将值为空的记录单独处理,再和其他计算结果进⾏union.

12. 请说明hive中 sort by ,order by ,cluster by ,distribute by各代表什么意思?

order by :会对输⼊做全局排序,因此只有⼀个reducer(多个reducer⽆法保证全局有序).只有⼀个reducer,会导致当输⼊规模较⼤时,需要较⻓的计算时间。

sort by :不是全局排序,其在数据进⼊reducer前完成排序

distribute by :按照指定的字段对数据进⾏划分输出到不同的reduce中

cluster by :除了具有distribute by 的功能外还兼具sort by 的功能

13. 描述数据中的null,在hive底层如何存储?

null在hive底层默认是⽤"\N"来存储的,所以在sqoop到mysql之前需要将为null的数据加⼯成其他字符,否则sqoop提示错误

14. Hive中 split、coalesce以及collect_list函数的⽤法?

split将字符串转化为数组

coalesce(T v1,T v2,...) 返回参数中的第⼀个⾮空值;如果所有值都为null,那么返回null

collect_list列出该字段所有的值,不去重 select collect_list(id) from table;

15. 如何将⽂件导⼊到hive表中?

load data local inpath '/a.txt' overwrite into table test partition(xx='xx')

16. Hive的排序分组⽅式?

row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利⽤它来实现分⻚

dense_rank() 是连续排序,两个第⼆名仍然跟着第三名

rank() 是跳跃排序的,两个第⼆名下来就是第四名

17. 请把下⼀语句⽤hive⽅式实现?

SELECT a.key,a.value
FROM a
WHERE a.key not in (SELECT b.key FROM b)

答案:

select a.key,a.value from a where a.key not exists (select b.key from b)

18. Hive内外部表的区别

删除表是否影响外部数据 内部表影响,外部表不影响

19. Hive如何做到权限管理

hive下可以修改配置后创建⽤户管理,但是仅仅是为了防⽌误操⽽已,如果要真的为了安全操作建议使⽤Kerberos(和Hadoop相同)

20. 说说对桶表的理解

对数据的细化 取模分开存储数据,提⾼查询效率

21. hive有哪些保存元数据的⽅式,有什么特点

(1)Single User Mode:默认安装hive,hive是使⽤derby内存数据库保存hive的元数据,这样是不可以并发调⽤hive的,这种模式时hive默认的存储模式。

(2)Multi User Mode:通过⽹络连接到⼀个数据库中,是最经常使⽤到的模式。假设使⽤本机mysql服务器存储元数据。这种存储⽅式需要在本地运⾏⼀个mysql服务器,并作如下配置(需要将mysql的jar包拷⻉到$HIVE_HOME/lib⽬录下)。

(3)Remote Server Mode:在服务器端启动⼀个 MetaStoreServer,客户端利⽤ Thrift 协议通过 MetaStoreServer 访问元数据库。

22. hive能建多个库吗

可以

23. 请谈⼀下hive的特点是什么?hive和RDBMS有什么异同?

hive是基于Hadoop的⼀个数据仓库⼯具,可以将结构化的数据⽂件映射为⼀张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进⾏运⾏。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专⻔的MapReduce应⽤,⼗分适合数据仓库的统计分析。

24. hive 是如何实现分区的?

(1)建表语句:   create table tablename (id) partitioned by (dt string)

(2)增加分区:   alter table tablenname add partition (dt = ‘2016-03-06’)

(3)删除分区:   alter table tablename drop partition (dt = ‘2016-03-06’)

25. hive 相对于 Oracle 来说有那些优点?

(1)存储,hive 存储在 hdfs 上,oracle 存储在本地⽂件系统。

(2)扩展性,hive 可以扩展到数千节点,oracle 理论上只可扩展到 100 台左右。

(3)单表存储,数据量⼤ hive 可以分区分桶,oracle 数据量⼤只能分表。

26. Hive 的 sort by 和 order by 的区别!

(1)order by 会对输⼊数据做全局排序,只有⼀个 reduce,数据量较⼤时,很慢。

(2)sort by 不是全局排序,只能保证每个 reduce 有序,不能保证全局有序,需设置mapred.reduce.tasks>1。

#面试##数据人的面试交流地#
全部评论
关注微信公众号:大数据左右手
1 回复 分享
发布于 2023-07-12 18:11 上海

相关推荐

04-11 00:51
已编辑
门头沟学院 Java
先说一下楼主的情况:双非本大三,两段实习,javaer,想要找一个暑期大厂offer,努力了两个月,三月份每天的状态就是算法,八股,项目,四月份更是一个面试没有,最终还是没有结果,心碎了一地。期间面了一些中小厂,大厂只有腾讯约面,其他大厂都投了一遍,但是还是石沉大海。再看一下楼主的面试结果吧,就不说ttl了腾讯s3:三面挂csig:一面挂teg:三面挂wxg:一面挂没错,面了八次腾讯,两次三面挂,当时真的心都碎了。其他中小厂都有面,有的没过,有的oc,但是都没有去。其他大厂投了简历,但是不是简历挂,就是测评挂,都说今年行情好很多,各大厂都扩招,可是问题出在那里呢?学历背景吗?实习经历吗?还是简历不够好看?依稀记得,从年初七就离开了家里,回到学校,早早准备面试,当时自己认为凭借着自己的两段实习经历,以及大二就开始准备的八股算法,拿大厂offer不是问题,但是还是不敢放松,回校的状态每天就是算法,八股,还有查看各种招聘信息,想着尽早投机会多,但是事实证明,投的早,不如投的刚刚好。当时想着,先投一些中小厂开始面试,找找面试感觉,从2.10就开始有面试了,基本都是线下面试,面试的感觉都很不错,觉得自己的状态慢慢回来了,期间也有oc一些中小厂,但是自己的目标并不在此,只是想练一下手,遂拒。后面投了腾讯的暑期实习基地,不久就约面了,第一次面这么大的厂,多少有点紧张,好在运气还不错,遇到的面试官也比较好,一直干到了三面,期间看牛客有不少说一面就挂了的,感觉自己还是比较幸运的,但是没想到倒在了三面,一周后就挂了,伤心是有的,但是想到这才刚刚开始,还有很多机会,便继续准备下一次面试了,很快,被另外一个部门捞了,一进会议,面试官没开摄像头,看网上说没开摄像头很多都是kpi,但是自己给自己打气,认为面试官只是不方便开摄像头罢了,面完,感觉良好,没问什么很难得问题,基本都答出来了,算法两道也a了一道,感觉实习不会这么严格吧?还是过了一会挂了,因为这个?还是技术不太匹配?面试过程中说搞C++的,心想,搞c++的你面我干啥?唉,这时候有点气馁,然后就接下来半个月没有面试。这时已经是三月底了,看到牛客好多人都已经陆陆续续拿到了offer,看人家的面试准备也没那么早,有0实习的,有没刷算法的,有两个面的,,,唉,反正是一言难尽啊,感觉努力没有什么意义,面试多半是看面试官的感觉,主观性很大啊,只要你技术没有太大的问题。第三次面试腾讯,面试来的比较突然,期间已经有几天没看八股什么的了,临时看了一下之前自己做的面试笔记,但是面试却异常顺利,三天闯到了三面,自己也不敢相信,三面玩感觉也良好,脑子里不得不想着一些“offer结算画面”,但是过了一会查看流程显示“流程终止”,我?哎,当时真的有苦说不出啊,也是一晚没睡。后面就逐渐开始褪去大厂梦了,看着曾经跟自己交流的牛油,朋友,认识的人,觉得他们技术不太如你,算法刷的没你多,进了大厂,但是这又如何呢?能力强不强不是你了说了,面试官说了算。也逐渐知道,不是你能力好就可以了,还得有运气,运气,运气。这个过程太累了,和自己和解吧,不用非得大厂,找个合适一点的就好,放轻松一点。今天有点心事睡不着,闲着想写一些自己的面试过程,勿喷。附上一张面试的情况,公司就不方便透露了。
怒卷的斯科特:八分运气两分实力
点赞 评论 收藏
分享
面试官人很好,态度和蔼可亲,没答出来时也会引导你去思考。由于是晚上面的,导致我白天一天都有点紧张,面的时候状态也不是很好,正常可能面试官提问完应该思考几秒再答,而我就像抢答一样一口气把所有会的都说出来,这样就导致逻辑比较混乱,东一句西一句的。首先是自我介绍,先把会的技术大致讲一下,由于我八股背的多所以着重讲了一下,Java,go,jvm,MySQL,Redis,计网,操作系统这些,然后一小部分闲聊,然后先问了一下项目,面试官问我这个项目是否落实之类的,直接坦言说是写的练手的,包括之前也写过IM通讯,外卖之类的。然后面试官就把提问的重点放在了八股上。先问了Java:类加载器(答:3种+自定义类加载器、tomcat、原因+双亲委派+好处)JVM参数(答:xmx,xms,newsize这些,问我是如何设定的,我回答是把内存分一半给堆,再把堆分一半给新生代,这方面确实不太了解)然后问了一下并发相关的:线程池(答:线程池的7个参数(忘了线程工厂和阻塞时间了),3个重要参数,还有线程如何启用,为什么要设计最大线程数之类的,提到Java栈默认分配1MB运行时不可以更改)AQS(答:先讲clh是自旋锁+list,然后是AQS在这个基础上做的两个优化,然后举了一下reentrantlock根据state如何获取资源)CAS(答:使用三个字段,aba问题,然后将通常搭配自旋锁实现,面试官问通常会自旋多少次,这个不太了解,答的100,然后问100次大概多少秒,回答微秒级,然后面试官讲了一下怎么做资源可能没用完,意识到可能还需要进行阻塞操作)然后考虑一下Linux命令(top,ps,如何使用管道符过滤线程和使用Linux启动线程没答出来)然后问Redis:持久化机制(答:三种aof,rdb,混合,aof的三个参数刷盘策略,rdb以快照保存,使用bgsave会使用子线程来保存不会阻塞,而aof虽然会阻塞但是只在写完数据后追加一条命令,不会太影响,然后是他俩的优缺点,还有混合是怎么保存数据的)集群模式(答:三种,主从复制到缺点再到哨兵机制,正常使用三个哨兵互相监督,主节点挂了投票选主哨兵然后选主节点,然后额外讲一下脑裂的问题,主节点进行数据更新然后把命令写入aof来同步从节点,最后cluster集群,如何实现,使用16383个哈希槽(艹答成16384了),先根据哈希码取余,再根据节点数取余决定放在哪个节点上,然后问了一下我会怎么选集群模式,首先是cluster的问题,会让管道操作之类的失效,然后哨兵会导致整个集群结构变得复杂,使用小项目可能会考虑哨兵,大的考虑cluster,然后考了一下cluster如果一个节点挂了怎么办,根据节点数重新取余然后数据转移,面试官说这么转移比较慢,有没有别的办法,我隐约记得使用一个类似环形数组的方式,想不起来了)然后考了一下MySQL的b+树(这方面的知识点太多了,导致我什么都想讲逻辑就比较乱,讲了一下聚簇索引,树的叶子节点对应着一张页16KB,MySQL有一个区的概念,把这些页放在同一个区中,这样叶子节点的双向链表遍历时速度更快,然后b+树的扇出比较大(非常二,说成扇度之类的,面试官以为说的是扇区)这样层数就比较小,一行1kb数据的话3层可以放心2000w数据)其他的暂时想不起来了算法是lru,面试官问要不要提示,我说写个,然后写了10分钟左右,说大概写好了,但是面试官指出了2个小错误,第一个马上就改回来了,第二个一直没看出来(大脑这时候已经停止工作了)反问:问学习建议,说根据实际的项目进行深入,考虑应该怎么做,还问了一下组里面是做Java的吗?面试官说他是做go的,组里什么语言都有,语言影响不大,连忙补充了一句我对go的底层有深入源码的学习)结束。总体感觉答得不太好,没有太体现出深度,细节也不够全面。
下一个更好呗:佬,我投完云智一直没消息,多久约的一面啊
查看14道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
46
分享

创作者周榜

更多
牛客网
牛客企业服务