进入DATE时代,大数据技术成为互联网发展的核心要素之一。与此同时大数据开发工程师的薪资也成为行业内高薪的代表。想从事大数据开发需要掌握多种核心技术:Hadoop、Hive、Storm、Spark、Scala等等。
而且这些技术知识点已经成为大数据工程师进入职场时面试中必备的考点。这里主要和大家分享一下数据仓库工具hive相关的面试题!
1、Hive的join有几种方式,怎么实现join的?
答:有3种join方式:
1)在reduce端进行join,最常用的join方式。
Map端的主要工作:为来自不同表(文件)的key/value对打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。
reduce端的主要工作:在reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在map阶段已经打标志)分开,最后进行笛卡尔。
2)在map端进行join,使用场景:一张表十分小、一张表很大。
在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeCache中取出该小表进行joinkey/value解释分割放到内存中(可以放大HashMap等等容器中)。然后扫描大表,看大表中的每条记录的joinkey/value值是否能够在内存中找到相同joinkey的记录,如果有则直接输出结果。
3)SemiJoin,semijoin就是左边连接是reducejoin的一种变种,在map端过滤掉一些数据,在网络传输过程中,只传输参与连接的数据,减少了shuffle的网络传输量,其他和reduce的思想是一样的。
实现:将小表中参与join的key单独抽取出来通过DistributeCache分发到相关节点,在map阶段扫描连接表,将joinkey不在内存hashset的纪录过滤掉,让参与join的纪录通过shuffle传输到reduce端进行join,其他和reducejoin一样。
2、hive内部表和外部表的区别?
内部表:建表时会在hdfs创建一个表的存储目录,增加分区的时候,会将数据复制到此location下,删除数据的时候,将表的数据和元数据一起删除。
外部表:一般会建立分区,增加分区的时候不会将数据移到此表的location下,删除数据的时候,只删除了表的元数据信息,表的数据不会删除。
3、hive是如何实现分区的?
建表语句:createtabletablename(id)partitionedby(dtstring)
增加分区:altertabletablennameaddpartition(dt=‘-03-06’)
删除分区:altertabletablenamedroppartition(dt=‘-03-06’)
4、Hive有哪些方式保存元数据,各有哪些优缺点。
1)存储于derby数据库,此方法只能开启一个hive客户端,不推荐使用
2)存储于mysql数据库中,可以多客户端连接,推荐使用。
5、hive如何优化?
1)join优化,尽量将小表放在join的左边,如果一个表很小可以采用mapjoin。
2)排序优化,orderby一个reduce效率低,distirbuteby+sortby也可以实现全局排序。
3)使用分区,查询时可减少数据的检索,从而节省时间。
6、hive中的压缩格式RCFile、TextFile、SequenceFile各有什么区别?
TextFile:默认格式,数据不做压缩,磁盘开销大,数据解析开销大
SequenceFile:HadoopAPI提供的一种二进制文件支持,使用方便,可分割,可压缩,支持三种压缩,NONE,RECORD,BLOCK。
RCFILE是一种行列存储相结合的方式。首先,将数据按行分块,保证同一个record在同一个块上,避免读一个记录读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。数据加载的时候性能消耗大,但具有较好的压缩比和查询响应。
7、hive相对于Oracle来说有那些优点?
1)存储,hive存储在hdfs上,oracle存储在本地文件系统。
2)扩展性,hive可以扩展到数千节点,oracle理论上只可扩展到台左右。
3)单表存储,数据量大hive可以分区分桶,oracle数据量大只能分表。
8、Hive的sortby和orderby的区别?
orderby会对输入数据做全局排序,只有一个reduce,数据量较大时,很慢。
sortby不是全局排序,只能保证每个reduce有序,不能保证全局有序,需设置mapred.reduce.tasks1。