数据分析面试总结

  • 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(交叉连接):生成来自多个表的行的笛卡尔乘积,将包括左表中的行右表中的行的组合