面经解析
-
- 多益网络
-
-
-
- 1.数据库索引的类型包括:**唯一索引、主键索引、聚集索引**
- 2.hive内部表和外部表的区别和应用场景
- 3.堆、栈、方法区
- 4.行列存储数据库的区别
- 5.数据倾斜
- 4.如何解决**MapReduce**数据倾斜呢
- 5.如何解决**hive**造成的数据倾斜?
- 6.java中重载和重写
- 7.数据库事务及其特性
- 8.having和where的用法
- 9.为什么进行维度建模
- 10.hive优化通常怎么做
- 11.hive的复杂类型有哪些,有什么区别
- 12.group by和distinct对应MR执行过程有什么区别
- 13.java面向对象的三大特征
- 14.哈希 优点
- 15.二叉树 平衡二叉树 b树与b+树的区别
- 16.sql中on和where的区别
- 17.sql中的几个join
- 18.hadoop与sql区别
- 19. select,from,where ,group by ,having,order by ,limit的执行顺序
- 20.HDFS组成
- 21.排序问题的复杂度
-
-
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