数据研发面经

2021.11.30 快手数据研发工程师一面

  • 自我介绍
    答:为什么选择做数据开发,比较合适,做事细心、认真。有些完美主义,其实这不是一件好事,然后喜欢做一件事情就能有一定的反馈成果,为什么不想要读博,一篇论文需要打磨很久才能到我想要的目的,那我在这个打磨得过程中,我看不到任何成果得反馈,我会着急。

  • 对数据结构有没有了解
    答:基本了解,本科学习过数据结构的课程。

链表和数组的区别

答:(1) 链表是链式存储结构,数组是顺序存储结构;
(2)链表通过指针连接元素与元素,在内存中不连续,而数组则是把所有元素按照顺序进行存储;
(3)链表的插入和删除元素容易,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难,而数组寻找某个元素较为简单,但插入与删除比较复杂,因为数组的最大长度在编程一开始就确定了,因此当达到最大长度时,扩充长度不如链表方便。
两者相同之处:都可以实现数据的顺序存储,构造的模型呈线性结构。

  • 主要用什么技术栈,对JAVA了解吗
    答:用python和java,对java了解
  • 手撕算法(反转链表
    (1)方法一:迭代
    说明:
    让后一个指针指向前一个,定义两个指针,pre和cur,最开始pre指向null,cur指向head
    每次让cur的next指向pre,实现一次局部反转
    局部反转之后,pre和cur同时往前移动一个位置
    循环上述过程,直至cur到达链表尾部
    java ListNode pre = null; ListNode cur = head; while(cur!=null&&cur.next!=null){ ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; }
    (2)方法二:头指针
    说明:
    原链表的头节点是反转之后链表的尾结点
    定义指针cur,指向head
    每次都让head下一个结点的next指向cur,实现一次局部反转
    每次反转之后,cur和head的next指针同时往前移动一个位置
    循环,直至cur到达链表的最后一个结点
       ListNode cur = head;
       while(cur!=null&&cur.next!=null){
   
          ListNode next = cur.next.next;
          cur.next.next = cur;
          cur=head.next;
          head.next=next;
      }

(3)递归
说明:让当前结点的下一个结点的next指针指向当前节点
让当前结点的next指针指向null,实现从尾部开始的局部反转
当递归函数全部出栈后,链表反转完成

     if(head==null ||head.next==null){
   
          return head;
     }
     ListNode re = reverseList(head.next);
     head.next.next = head;
     head.next = null;
     return re;
     }
怎么判断链表是不是环形链表

答:运用两个双指针,快慢指针,快指针每次走两步,慢指针每次走一步,最终两个指针会相遇(在不是null的地方)

怎么找到环形链表的入口

答:相遇的点就是环形链表的入口

简单介绍一下hive

答:基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL(HQL)查询功能。
数据仓库:存数据的地方,存的数据更大,仓库里面放的数据内容都是分门别类的,
hive能解决的问题,mapreduce一定能解决,反之不成立
(1)hive处理的数据存储在HDFS
(2)hive分析数据底层的实现是mapreduce
(3)执行程序运行在yarn上

可以看做是hadoop的客户端,一个入口,提交的是hql代码,实现的mapreduce操作

hive是怎么将sql转化成mr任务的

答: 数据仓库通过SQL进行统计分析,将SQL语言中常用的操作(select,where,group等)用MapReduce写成很多模板,所有的mapreduce模板封装在hive中;然后客户端根据用户需求编写相应的sql语句,到封装到hive中的mapreduce模板中找到所需要的,然后通过hive框架匹配出相应的mapreduce模板,运行mapreduce程序,生成相应的分析结果。最后将结果返回给客户端。
hive中写了一套逻辑,将sql转换成mr,hive相当于是hadoop的一个客户端,通过提交sql让hive解析,封装成mapreduce任务去hdfs读取数据,提交给yarn执行
针对sql语言如何写mapreduce模板

select deptid,count(*) from emp group by deptid 

mapreduce的流程:inputformat读取数据,给map,map给reduce,reduce再给outputformat,key是deptid,value的值是count
首先,根据from字段决定inputformat读什么数据,from是表的名字,而inputformat是读取的文件夹

hive的元数据记录着表名和hdfs的对应关系

hive中四种排序的区别(sort by/ order by/ distributed by/ cluster by),你在什么场合下用过这些排序函数?

答案:
(1)order by是全局排序,只有一个reducer,改reducer个数也没有意义。number of reducers = 1。
(2)sort by是区内排序(每个recude内部),达不到全局排序的效果。可以自己定义reduce个数。分区没有规律(随机的,害怕数据倾斜),可以自定义
(3)distribute by是用来做分区的,和sort by连用的。往往是先distribute by(比如根据部门分区,然后在部门内部的薪水进行排序),为了给sort by使用的。
(4)cluster by,当distribute by与sort by字段一样,可以用cluster by代替,除了具有distribute by的功能外还兼具sort by的功能,但是排序只能是升序排序,不能指定排序规则为ASC或者DESC
在这里插入图片描述

  • 实习的时候有遇到过什么困难,然后你是怎么解决的
  • 除了hive还了解诸如spark 和flink这些吗
  • 遇到数据倾斜怎么解决
  • 你觉得数据研发的优势在哪
  • 你对自己未来3-5年的规划是什么样的
  • 一道sql,求出每个用户最大连续登录天数
    链接: link.
user_id log_in_date
u_01 2020-01-02
u_01 2020-01-04
u0001 2019-10-10
u0001 2019-10-11
u0001 2019-10-12
u0001 2019-10-13
u0001 2019-10-14
// 按时间降序排序
select 
	user_id,
	log_in_date,
	(row_number() over(partition by user_id order by log_in_date desc)) as 'rank'
from 
	user_log
--按时间升序排列
select 
	user_id,
	log_in_date,
	(row_number() over(partition by user_id order by log_in_date asc)) as 'rank'
from 
	user_log
//row_number()进行排序,分区排序
//用登录时间相减(相加)排序好的序列号
select
	user_id,	
	DATE_ADD(log_in_date, INTERVAL row_number() over(partition by user_id order by log_in_date DESC ) day) AS 'add_time'
FROM user_log
//连续登录天数
SELECT user_id, add_time,count(add_time) AS '连续登录天数'
FROM 
(
select
	user_id,	
	DATE_ADD(log_in_date, INTERVAL
  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值