面试总结

最近面试了几家公司,把整个过程中的能记得的问题和自己当时的回答记录一下,希望对一些朋友有用。可能有的说的不是很准确,勿喷!
面试总结:
一.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不同对象在内存中保存的位置
   答:基本类型在栈中存放,实例对象放在堆中,但是会有一个相应的引用类型放在栈中。还有一部分是用来装静态变量
   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值