1. 面试描述
这是我人生的第三次面试. 投的这两家网易的大数据开发实习岗都接到面试通知了, 但是没想到爱奇艺竟然在简历关挂了, 给我的理由是人已经招满了. 不知道是真的招满了还是简历关就被刷了.
首先面试还是自我介绍, 和前面的面试不同, 这个面试官问项目问的很细, 问了项目的功能, 架构,
还有就是相比较其他的现成的股票分析网站有什么优势.
然后问到了怎么解决mysql中数据量非常大之后的性能下降问题, 答案是建索引和分库分表**(这里幸亏前几天吃麻辣香锅的时候等位无聊看的mysql分表的知识了, 要不然就gg了)**
然后问到数据量这么大有没有考虑用HDFS, Hive来进行存储和查询, 回答肯定是没有的. 因为我自己就一台电脑, 用了也等于没用.
又反问到学校实验室没有提供资源来搭建集群? 回答就是需要导师的经费, 项目不是导师的, 没让买
最后问的是项目中碰到的困难 1. WSL装MySQL 2. http连接池 3. log4j
然后问到爬虫爬这么快会不会被限制, 我说明了robots协议里面确实没有限制, 然后又提到b站的爬虫是有限制的, 爬取次数快就会被封, 要使用ip池.
然后又被问到为什么不使用八爪鱼这样的现成的爬虫应用, 而是自己定义一个. 回答是可以八爪鱼的优点是可以爬取反爬虫机制比较高的网站, 我爬的这个不需要. 并且自己写爬虫根据自己的需求来自定义, 灵活度高, (其实八爪鱼我也没用过, )
接下来就说要问基础知识了, 第一个问的是数组和链表的区别, 和应用场景(我心想这也太基础了吧, 大一大二的学生都能答上来). 我的回答是数组用于一般的list, 因为数组可以随机访问, 比链表快, 并且数组经过ArrayList这样的动态扩容类修饰之后也解决了不能扩容的问题了. 并且扩容比LinkedList更快(因为ArrayList只有在满了的时候才会new新的数组, LinkedList每一次add都会new新的节点, 频繁的调用new与内核打交道非常耗费时间), 也提到了数组可以利用缓存达到遍历读取更快的效果.
应用场景就回答的大部分情况用ArrayList. (因为我觉得LiknedList在插入和删除方面的优势真的体现不出来, 你插入一个元素总得定位到一个位置吧, 定位的这个过程就O(n)了, 插入是O(1)有什么用? 删除的时候总得先找到要删除哪个元素吧, 这个过程也是O(n). ), 需要用到双端队列的时候采用LinkedList, 来实现Queue或Stack.
然后就又是经典的topK问题了, 1亿个数选前k个最大的. 我问的是这些数是不是存在同一台机器上的, 回答是存在同一台机器上, 然后又问内存能不能把这些数全读进来, 面试官让我两种情况都讨论一下, 那就很简单了, 不能全读到内存中用堆存储前k个最大的, 扫描一遍即可. 复杂度O(n*logk). 能读到内存中就用快速排序的思想, 复杂度O(n)
然后又问MySQL索引, 我就只说了InnoDB的索引, 聚簇索引和非聚簇索引. 然后说了下索引树叶子节点和MyISAM的区别, 非聚簇索引的回表查询, B树和B+树的区别…
然后让写了几个SQL,
第一个问题就是有个表, 列中是uid, date, level, 表示哪个用户在什么时间通过了哪一个关卡. 让求2020.11月每一个用户, 每天通过的关卡数量. 这个简单, 我感觉主要就是考察group by和聚合函数吧. 没什么难的.
但是尴尬的是, 面试官没说这个表的名字是什么, 我写的时候也忘了写from
子句了. 还好面试官提醒我让我检查检查.
1 | # uid date level |
第二个就是排序, 给出id和分数, 让输出排名. 这个题有窗口函数就很简单, 但是写完了之后, 面试官告诉我窗口函数里面的order by就已经对数据进行排序了, 外面就不用再order by一次了. 这个我是不知道的.
1 | # uid score |
下一个问题就是介绍三个窗口函数, rank() row_number() dense_rank()
的区别了, 这个不难, 然后就说让我不用窗口函数实现排序. 这个假如我之前没学过绝对写不出来, 所以这里要推荐一波SQL50题[50道SQL练习题及答案与详细分析 - 简书 (jianshu.com)], 学完这些基本的SQL都不用怕了. 当然里面也包括不使用窗口函数完成排序.
1 | select uid, t1.score, (select count(*) from t1 as tmpT1 where t1.score < tmpT1.score) + 1 as `rank` |
然后最后问的是mapreduce流程, 这个在之前的面试中也问道过, 所以很轻易地答出来了, 答得也比较完整.
最后出人意料的是没问算法题. 可能SQL就已经算是算法题了? 但是这个难度和算法题不是一个难度的吧
2. 面试感想
感觉这次的面试不太像我想要的岗位, 感觉更偏向数据仓库这方面, MySQL和SQL语法问的比较多, Java几乎没问, 项目问的时候也集中在MySQL这个点上(分表什么的). Java多线程没问, 集合没问. 算法题也没问.
我记得当时约面试的时候HR给我说大数据开发实习有2个方向, 一个是偏Java开发的, 一个是偏数据仓库的. 我还特意选择了偏Java的. 没想到问的还是这么偏数仓.
其实感觉数仓会比较无聊, 天天当curd boy, SQL boy. 所以应该会选择第一个我面试的大数据开发岗吧, 至少还能玩玩spark和flink