最近面试了几家公司,把整个过程中的能记得的问题和自己当时的回答记录一下,希望对一些朋友有用。可能有的说的不是很准确,勿喷!
面试总结:
一.HQL部分
1.hql的行转列怎么实现
答:1.多个字段转一个字段可以使用union all
2.一个字段里面内容按逗号分隔转一个字段多行使用表生成函数,即:lateral view explode
2.count(distinct xxx)如何优化
答:group by
3.Hive里的UDF有哪几种
答:UDF和UDAF,UDTF
补充:开发普通的UDF可以通过重写evaluate方法实现,还可以通过extends GenericUDF,重写initialize、getDisplayString、evaluate方法
4.数据倾斜会出现在什么情况下,如何处理
答:
发生场景:
1.有聚合运算的时候
2.有join的时候
处理方案:
第一种方案:建临时表
第二种方案:将key通过随机数打散后运算,然后再重新拆分聚合
第三种方案:设置参数 set hive.exec.reducers.bytes.per.reducer以及set hive.optimize.skewjoin = true
第四种方案:大小表关联用map join,group by的时候设置参数
5.hive的mapjoin默认是开启的还是关闭的,map join的原理是什么
答:hive 0.11以后mapjoin默认是开启的,但是在用的时候需要设置一下小表数据大小的阈值。
原理:将小表直接加载到内存中通过hashtable打散到各个map,并与大表在map端进行匹配。(说的不是很详细。自己可以去查一下)
6.select a.id,b.name from a join b on a.id=b.id 说一下这条sql的mr过程
答:Map端输出的时候按join on的列为key,给每个value打一个tag标示来源于哪个表并按照key进行排序
shuffle阶段根据key值进行hash,按照hash值将key/value推送至不同的reduce中,确保两个表中相同的key位于同一个reduce
reducer阶段根据key值完成join操作,期间通过Tag来识别不同表中的数据
7.select id,age from a where id =1这条sql会不会起reduce,是否需要优化,如果需要,应该怎么优化,为什么这么优化?
答:hive默认会启动一个reduce。
可以优化,因为没有计算,所以不需要启动reduce,可以通过设置reduce个数等于0优化。
因为如果不启动reduce的话避免了shuffle的过程。shuffle里面有partition,sort,spill等操作,会浪费很多资源和时间。
8.hive有哪几种文件存储格式,大概说一下原理
答:主要用到的是text和rcfile以及 SequenceFile
其中text为默认的存储格式,如果建表的时候不特殊指定则采用这种格式存储
rcfile 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。
其次,块数据列式存储,有利于数据压缩和快速的列存取。
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。
9.写个sql,分组取top N
答:貌似很多人都会问到这个问题,一般采用最low的方法就是用row_number给每条记录打标,然后做嵌套查询。
10.hive中 Sort By,Order By,Cluster By,Distrbute By的区别是什么
答:order by:会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间
sort by:不是全局排序,其在数据进入reducer前完成排序。
distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。
cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能
二.Hadoop部分
1.hadoop提交任务的流程
答:client先向RM提交一个RPC请求,RM返回给client一个jobid,client会根据jar的名字和jobid等信息拼接成一个临时jar文件名
并将本地jar以那个临时文件名put到hdfs。然后client向RM再次发送请求。RM开始计算需要的MAP和Reduce数并给nodemanager分配任务
2.MapReduce的运行流程
答:1.通过input 进行输入分片
2.map进行运算
3.Combine阶段和shuffle阶段进行partition运算并按key值进行sort排序由于map输出不能只在内存,
所以当内存快要满的时候就会进行spill操作将内存数据写入到硬盘的临时文件当中
4.reduce阶段做计算输出
3.写个MR程序。有一个文件里面放的是一堆英文单词,输出是同位词放在一行例如(post,stop)
答:思路是将每个单词转成list并进行sort以此作为key,在reduce中进行拼串。原理同wordcount类似。
4.kylin的原理
答:进行预计算将不同维度的计算结果存放到HBASE中,查询的时候直接访问HBASE的rowkey对应的值即可
三.数仓部分
1.介绍一下你们现有的数仓体系,你在里面担任什么样的角色
2.元数据这块是怎么做的
3.数据质量管控如何实现
4.如何应对上游系统的物理删除和表结构的变更
5.数仓分了几层,主题如何划分的,这样划分的目的是什么
6.为什么要建设数仓,好处在哪里
四.JAVA部分
1.list和set的区别什么
答:list有序且可重复,底层实现是数组
set无序且不可重复,底层实现是Map,只用到了Map的key
2.数据和链表哪个查询速度快
答:数组
3.写个程序输出10000以内的质数,程序的时间复杂度是多少
答:百度
4.5000亿条是数据文件,里面放的是IP,求IP次数出现最多的前10个
答:百度
5.java不同对象在内存中保存的位置
答:基本类型在栈中存放,实例对象放在堆中,但是会有一个相应的引用类型放在栈中。还有一部分是用来装静态变量