数据分析面试总结
- 1. 介绍下hadoop的底层
- 2. 数据库三大范式
- 3. 数据库四大原则
- 4. 简述快排 及 复杂度
- 5. 简述链表 和 数组区别
- 6. 解决哈希冲突的方法
- 7. 简述sql中left join、right join 和cross join
1. 介绍下hadoop的底层
- hdfs 分布式存储
- 扩展性&容错性&海量数量存储
- 数据会拆成小块 128MB 一个block
- 数据会冗余 默认3个副本
- name node
- 负责客户端请求的响应
- 负责元数据(文件的名称、副本系数、Block存放的DN)的管理
- 监控DataNode健康状况 如果死亡更换
- data node
- 存储用户的文件对应的数据块(Block)
- 要定期向NN发送心跳信息,汇报本身及其所有的block信息,健康状况
- mapreduce 分布式计算
- 理解map() reduce 编程思想(分而治之)
- Tasks 分:把复杂的问题分解为若干"简单的任务"
- Reduce Tasks 合:reduce
- mapreduce流程
- input data:输入数据
- InputFormat:对数据进行切分,格式化处理
- map:将前面切分的数据做map处理(将数据进行分类,输出(k,v)键值对数据)
- shuffle&sort:将相同的数据放在一起,并对数据进行排序处理
- reduce:将map输出的数据进行hash计算,对每个map数据进行统计计算
- OutputFormat:格式化输出数据
- mrjob
- yarn 资源调度协调
- resource manager
- node manager
- application master
- container
- yarn执行流程
- Client提交作业请求
- ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个Container(容器),并将 ApplicationMaster 分发到这个容器上面
- 在启动的Container中创建ApplicationMaster
- ApplicationMaster启动后向ResourceManager注册进程,申请资源
- ApplicationMaster申请到资源后,向对应的NodeManager申请启动Container,将要执行的程序分发到NodeManager上
- Container启动后,执行对应的任务
- Tast执行完毕之后,向ApplicationMaster返回结果
- ApplicationMaster向ResourceManager 请求kill
2. 数据库三大范式
- 第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即每一个属性都是原子的,不能再分,也可以理解为不能表中套表。
- 第二范式:要求每个非主属性完全依赖于主键,不存在对主键的部分函数依赖。
- 学号不是主键,学号能决定姓名,年龄,地址,但是凭学号这一项,是决定不了成绩这一项,所以这张表的主键是**(学号,课程号)**
- 在这里尽管主键是(学号,课程号),但是姓名,年龄和地址只要学号就可以决定的,也就是说这三个属性对主键存在部分函数依赖,它只依赖于主键里面的学号这一项,只依赖于主键的一部分,所以不是第二范式。
- 可能产生:插入异常、删除异常、数据冗余、更新异常
- 第三范式:不存在属性对主键的传递依赖
- 有一员工信息表,属性分别是员工号,工资级别,工资
- 这张表的主键是员工号,一旦员工号确定了,工资级别也确定了,那么工资也就确定了。
但是工资对员工号存在传递依赖
3. 数据库四大原则
- 原子性 一个事务要么全部执行,要么不执行
- 一致性 事务开始之前和事务结束后,数据库的完整性约束没有被破坏
- 隔离性 事务的执行互不干扰
- 脏读:A会话读到了B会话未提交的数据。
- 不可重复读:一个事务范围内的两个相同查询返回了不同数据。A会话两次查询,查询的结果记录数是一致的,但是记录本身不一致。B会话在两次查询之间发生update语句。
- 幻读: A会话两次查询,查询的结果记录数是不一致的。 B会话在两次查询之间发生insert delete语句
- 持久性 事务执行成功后,该事务对数据库的更改是持久保存在数据库中的
4. 简述快排 及 复杂度
快排思想:用到了分治思想,和分治算法一样为了进行排序需要先对其划分的子区间进行排序。
- 基本思想:在待排序的序列中选取一个值作为一个基准值,按照这个基准值得大小将这个序列划分成两个子序列,基准值会在这两个子序列的中间,一边是比基准小的,另一边就是比基准大的。
- 这样快速排序第一次排完,我们选取的这个基准值就会出现在它该出现的位置上。这就是快速排序的单趟算法,也就是完成了一次快速排序。然后再对这两个子序列按照同样的方法进行排序,直到只剩下一个元素或者没有元素的时候就停止,这时候所有的元素都出现在了该出现的位置上。
- 左右指针法实现思路:
- 在一段区间内我们有一个值key(基准),一般会选择数组的头或者尾
- 从左边区间进行遍历,直到找到一个大于key的值就停下
- 然后再从右边找小于key的值,找到一个也停下来
- 我们将左右的值进行交换,这样左边那个大于key的值就被换到了右边,而右边那个比key小的值就被换到了左边
- 当左右两个指针相遇的时候就说明所有元素都与key做过了比较。然后再将左指针所在的元素赋值给key
- 此时按照上述方法进行递归实现[left, key]和[key+1, right]
快排复杂度:
平均复杂度:O(nlogn)
最坏复杂度:O(n2 )
5. 简述链表 和 数组区别
不同:
- 链表是链式的存储结构,元素的空间可以在任意地方,空间是分散的,不需要连续
- 数组是顺序的存储结构,数组的存储区间是连续的,占用内存比较大
- 链表通过指针来连接元素与元素,查找数据时间效率低,时间复杂度是o(n)
- 数组则是把所有元素按次序依次存储,查找速度快,时间复杂度是o(1)
- 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充
- 数组插入与删除比较复杂,当达到最大长度时,扩充长度不如链表方便
相同:
- 两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构
6. 解决哈希冲突的方法
- 开放地址方法
- 线性探测 如果某数据的值已经存在,则在原来值的基础上往后加一个单位,直至不发生哈希冲突。
- 再平方探测 在原来值的基础上先加1的平方个单位,若仍然存在则减1的平方个单位。随之是2的平方,3的平方等等
- 伪随机探测 通过随机函数随机生成一个数,在原来值的基础上加上随机数,直至不发生哈希冲突。
- 链式地址法(HashMap的哈希冲突解决方法)
对于相同的值,使用链表进行连接。使用数组存储每一个链表。
- 优点
- 拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
- 由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
- 在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。
- 缺点:
指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。
- 建立公共溢出区
建立公共溢出区存储所有哈希冲突的数据。 - 再哈希法
对于冲突的哈希值再次进行哈希处理,直至没有哈希冲突。
7. 简述sql中left join、right join 和cross join
- inner join(内连接):只返回两个表中联结字段相等的行
- left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录
- corss join(交叉连接):生成来自多个表的行的笛卡尔乘积,将包括左表中的行与右表中的行的组合