面试总结

来源:互联网 发布:淘宝卖家后台网址 编辑:程序博客网 时间:2024/06/11 20:11
最近面试了几家公司,把整个过程中的能记得的问题和自己当时的回答记录一下,希望对一些朋友有用。可能有的说的不是很准确,勿喷!面试总结:一.HQL部分  1.hql的行转列怎么实现  答:1.多个字段转一个字段可以使用union all      2.一个字段里面内容按逗号分隔转一个字段多行使用表生成函数,即:lateral view explode  2.count(distinct xxx)如何优化  答:group by  3.Hive里的UDF有哪几种  答:UDF和UDAF  补充:开发普通的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不同对象在内存中保存的位置   答:基本类型在栈中存放,实例对象放在堆中,但是会有一个相应的引用类型放在栈中。还有一部分是用来装静态变量   

1 0
原创粉丝点击