面试总结


目前就上海招聘的信息来看:
一、etl、sql工程师占60%,多半是外包
(一)笔试多是sql,典型的
1.Hive 实现wordcount
select word,count(*) 
from (
select explode(split(sentence,' ')) as word from article b ) t 
group by word
2.类似于这种购买占比或者平均数(每个用户一个订单平均是多少商品trains:对应的一个订单多少商品/订单数order_id,product_id)
select user_id,sum(pro_cnt)/count(1) order_2 ,
avg(pro_cnt) order_avg
from 
orders o
join (select order_id,count(product_id) pro_cnt 
from
train group by order_id) t
on t.order_id=o.order_id 
group by user_id
limit 10
3.每个用户最喜爱购买的三个product是什么,最终表结构可以是三个列,也可以是一个字符串/数组 类似于topn
select user_id, 
collect_list(concat_ws('_',product_id,cast(row_num as string))) as pro_top3,
size(collect_list(product_id)) as top_size
from
(
select user_id,
product_id,
top_cnt,
row_number() over(partition by user_id order by top_cnt desc) as row_num
from
(
-- user_id,product_id,count(1)这个用户其中一个商品购买了几次
select 
ord.user_id as user_id,
pri.product_id as product_id,
count(1) over(partition by user_id,product_id) as top_cnt
from 
(select * from orders where eval_set='prior')ord
join 
(select * from order_products_prior limit 10000)pri 
on ord.order_id=pri.order_id
-- group by ord.user_id,pri.product_id
)t 
)t1  where row_num <=3 group by user_id limit 10; 

4.每个用户在一周中的购买订单的分布(列转行)  
user_id,dow0,dow1,dow2,dow3,dow4...dow6
1       0    0    1    2    2      0
select 
user_id,
sum ( case when order_dow='0' then 1 else 0  end) dow0,
sum ( case when order_dow='1' then 1 else 0  end) dow1,
sum ( case when order_dow='2' then 1 else 0  end) dow2,
sum ( case when order_dow='3' then 1 else 0  end) dow3,
sum ( case when order_dow='4' then 1 else 0  end) dow4,
sum ( case when order_dow='5' then 1 else 0  end) dow5,
sum ( case when order_dow='6' then 1 else 0  end) dow6
from orders group by user_id

类似于     
张三   70    语文
张三   60     数学
张三   80    物理
姓名  语文  数学   物理
张三   70    60     80

select name,
sum (case when subject='语文' then score else 0  end) ‘语文’
sum (case when subject='数学' then score else 0  end)  ‘数学’
from student
group by name;

(二)hive的基础知识:
1.hive只是个提交命令的客户端:原理提交的sql提交到集群,解析为mapreducer,有解析器,优化器,执行计划
元数据是存在设置的关系型数据库mysql 比如表的schema信息,注册的udf函数,数据路径等等
2.外部表与内部表、分区表、桶表等  使用场景与各自的特点
3.hive的优化,写sql当然是sql优化优先,资源优化、
4.hive的引擎默认是mr ,可以配置spark与tez,加快执行速度,hive on spark 的配置版本对应是特别严格的,原生hive与spark集成的需要修改pom文件的依赖编译源码,clouder的没试过
5.自己项目中hive sql的业务逻辑必须清楚
6.数仓建模  
(1)维度建模的心型模型,雪花模型 各自的优缺点
(2)公司数据仓库的分层与设计架构 (我也不是很清楚,源表-清洗->dw()->事实表、维度表-》业务统计-》临时表-》结果表)
(3)调度工具,oozie,crontab ?依赖性怎么解决的  数据量小无依赖?
(4)spark sql进行数据仓库建模-》源表(hive的)-》createTempView-》字段抽取-》中间表->结果表(mysql)?
二、Hadoop、spark语言开发占30%
1.离线业务存hbase的数据
(1)habse的java 开发接口put get scan  等
(2)hbase master掉了,可以读写数据 regionserver的元数据信息在zk上 master负责region的分裂与管理
(3)hbase 的过滤器 单列过滤器singeColumnFilter,rowkey前缀匹配rowRegxFilter,rowkey包含某字符串的过滤器、通过scan.setFilter设置扫描前的过滤器
(4)hbase 的row设计原则,hbase的三大机制(split、合并、flush)、底层lru缓存策略、regionsever与hfile、storefile,等原理
(5)habse 与phoniex集成 写sql 或者直接使用java( get scan )进行数据查询 web展示
2.写过mr程序吗?
(1)mr的setup ,map,reduce三个主要方法的含义
(2)自定义输出mysql 类继承outputformat 重写context.write的子类方法,mr读取hbase继承 tableMapper类,返回值的value 是查询的行数据
(3)mapreduce的执行过程,及大概的原理 
3.重头戏java 考察一个程序员是否具有开发能力的标准
(1).数据结构与算法
数据结构必须掌握:数组、链表、树、图,基于这些去看算法(创建二叉树,前中后序遍历二叉树、反转树、霍夫曼树)
算法:光排序的就有8种以上
https://leetcode-cn.com/problemset/all/(50到 经典算法面试    循序渐进的过程必须练习才可以达到人家要求多写)
被问到的:单链表反转,快排,寻找连续的n个数组成的最小值
(2)基本知识 集合、多线程、反射 基本是问的头皮发麻
https://zhuanlan.zhihu.com/p/26679704 
被问到hashmap的初始容量16 ,扩容因子3/4 ,底层数据结构 entry数组内存节点相连的链表 ) 扩容机制 与hash机制、put 与get 的实现 jdk1.7与1.8的不一样 
java.utils.concurrent包里的concurrentHashmap的实现原理  线程安全一些概念cas与自旋 volatile与同步关键字、等一些知识 太复杂,要学的太多了  ,乱乱乱  jdk1.7与1.8的不一样 
(3)设计模式  重点  手动要写一边 
(4)web方面  spring框架的原理与概念(事物、ioc、aop)  其他的会用就行
(5)redis
4.spark开发 
(1)spark与mr的特点,区别
(2)rdd的特性
(3)map与mappatotion,foreach与foreachPatiotion的算子的区别
(4)开发中遇到哪些算子  map、filter、reducebykey,reduce,groupbykey,zip,join,leftjoin等等
(5)rdd转dataframe 样例类继承product接口后,字段可以超过22个  rdd与dataframe的区别
(6)spark sql使用的是写sql 还是算子api的方式
(7)task与分区对应,stage、job 、是咋们划分的  webui是怎么进行观察调优的
(8)如何给rdd或者df 加一列唯一主键  zipWithIndex()算子或者 zipWithUniqueId()
(9)spark sql api方式的这种 :funtions包里面的算子与udf函数定义
import org.apache.spark.sql.functions._
val avg_udf = udf((sm: Long, cnt: Long) => sm.toDouble / cnt.toDouble)
//  udf的使用:
jproduct.withColumn("mean_re", avg_udf(col("sum(reordered)"), col("count"))).show(5)
jproduct.withColumn("mean_re", avg_udf(col("sum_re"), col("count"))).show(5)
jproduct.selectExpr("*", "sum_re/count as mean_re")
(10)spark sql与hive集成 做etl
(11)spark streaming的与kafak的集成方式  默认的分区规则,两种方式的弊端,
direct模式如何实现精准一次的语义,代码改变checkpoint序列化错误 如何实现自主管理偏移量 
kafka的消费者的节点的增减,重新负载均衡问题的offset提交策略问题(难难难理解)
structstreaming用过没 有啥特征
(12)scala与java的对比 区别  特性  柯力化函数意思?
(13)手写实现一些逻辑 top n 简单 ,rdd的左右join问题,分类型保存数据的实现  foldleft聚合算子的用法
(14)case关键字的偏函数 
(15)sparkStreaming kafka出现[9点到9点边有]脏数据如何去掉,处理完成替换jar包是 这段时间的数据堆积问题
(16)spark 依赖的第三方jar 通过submit提交 避免报错 --jars 或者配置到spark的classpath   提交是17)提交数据 根据数据量与集群资源 你给定的核数 内存数 总核数  怎么去划分的
(18) 
三、其他平台开发、数据采集开发10%
这种已经是大数据应用开发  开源二次开发 开源组件集成 自己业务平台
1.flume的断点续传
2.必问的jvm调优 内存模型  用过啥java的资源,线程的监控工具没?jconlse、jvisualvm  链接https://jingyan.baidu.com/article/e9fb46e172e3747521f76611.html
3.yarn的调度策略、集群调优经验、spark提交资源按照啥规则算法在每个节点上进行executor分配的
4.多线程与设计模式  必须会而且懂得深

 

posted @ 2019-05-29 00:11  夜半钟声到客船  阅读(343)  评论(0编辑  收藏  举报