数据仓库面试总结

文章目录

1.什么是数据仓库?

  1. 概念
    存储数据的仓库, 主要是用于存储过去既定发生的历史数据, 对这些数据进行数据分析的操作, 从而对未来提供决策支持
  2. 四大特征
  • 面向于主题的: 面向于分析, 分析的内容是什么 什么就是我们的主题
  • 集成性: 数据是来源于各个数据源, 将各个数据源数据汇总在一起
  • 非易失性(稳定性): 存储在数据仓库中数据都是过去既定发生数据, 这些数据都是相对比较稳定的数据, 不会发生改变
  • 时变性: 随着的推移, 原有的分析手段以及原有数据可能都会出现变化(分析手动更换, 以及数据新增)

2.ETL是什么?

抽取 转换 加载

从数据源将数据灌入到ODS层, 以及从ODS层将数据抽取出来, 对数据进行转换处理工作, 最终将数据加载到DW层, 然后DW层对数据进行统计分析, 将统计分析后的数据灌入到DA层, 整个全过程都是属于ETL范畴

狭义上ETL: 从ODS层到DW层过程

3.数据仓库和数据库的区别(OLTP和OLAP的区别)

OLTP:联机事务处理

OLAP:联机分析处理

  • 数据库(OLTP): 面向于事务(业务)的 , 主要是用于捕获数据 , 主要是存储的最近一段时间的业务数据, 交互性强,一般不允许出现数据冗余
  • 数据仓库(OLAP): 面向于分析(主题)的 , 主要是用于分析数据, 主要是存储的过去历史数据 , 交互性较弱 ,可以允许出现一定的冗余

4.数据仓库和数据集市的区别

  • 数据仓库其实指的集团数据中心: 主要是将公司中所有的数据全部都聚集在一起进行相关的处理操作 (ODS层),此操作一般和主题基本没有什么太大的关系

  • 数据的集市(小型数据仓库): 在数据仓库基础之上, 基于主题对数据进行抽取处理分析工作, 形成最终分析的结果

    一个数据仓库下, 可以有多个数据集市

5.维度分析

5.1 什么是维度?

维度一般指的分析的角度, 看待一个问题的时候, 可以多个角度来看待, 而这些角度指的就是维度

比如: 有一份2020年订单数据, 请尝试分析

可以从时间, 地域 , 商品, 来源 , 用户...

  1. 维度的分类:
    • 定性维度: 指的计算每天 每月 各个的维度 , 一般来说定性维度的字段都是放置在group by 中
    • 定量维度: 指的统计某一个具体的维度或者某一个范围下信息, 比如说: 2020年度订单额, 统计20~30岁区间人群的人数 ,一般来说这种维度的字段都是放置在where中

维度的下钻和上卷 : 以某一个维度为基准, 往细化统计的过程称为下钻, 往粗粒度称为上卷

比如: 按照 天统计, 如果需要统计出 小时, 指的就是下钻, 如果需要统计 季度 月 年, 称为上卷统计

5.2什么是指标?

指标是衡量事务发展的标准,也叫度量,如价格,销量等;指标可以求和、求平均值等计算。
指标的分类:

  • 绝对指标: 计算具体的值指标
    count() sum() max() min() avg()
  • 相对指标: 计算比率问题的指标
    转化率, 流失率, 同比

6.什么是数仓建模?

数仓建模 指的是如何在hive中构建表, 数仓建模中主要提供两种理论来进行数仓建模操作: 三范式建模维度建模理论

  • 三范式建模: 主要是存在关系型数据库建模方案上, 主要规定了比如建表的每一个表都应该有一个主键, 数据要经历的避免冗余发生等等

  • 维度建模: 主要是存在分析性数据库建模方案上, 主要一切以分析为目标, 只要是利于分析的建模, 都是OK的, 允许出现一定的冗余, 表也可以没有主键

维度建模的两个核心概念:事实表和维度表

7.事实表

事实表: 事实表一般指的就是分析主题所对应的表,每一条数据用于描述一个具体的事实信息, 这些表一般都是一坨主键(外键)和描述事实字段的聚集

事实表的分类:

  1. 事务事实表 :
    保存的是最原子的数据,也称"原子事实表"或"交易事实表"。沟通中常说的事实表,大多指的是事务事实表。
  2. 周期快照事实表:
    周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,时间间隔如每天、每月、每年等等
    周期表由事务表加工产生
  3. 累计快照事实表:
    完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点

7.维度表

维度表: 指的在对事实表进行统计分析的时候, 基于某一个维度, 这个维度信息可能在其他表中, 而这些表就是维度表

维度表并不一定存在, 但是维度是一定存在 :

比如: 根据用户维度进行统计, 如果在事实表只存储了用户id, 此时需要关联用户表, 这个时候就是维度表

比如: 根据用户维度进行统计, 如果在事实表不仅仅存储了用户id,还存储用户名称, 这个时候有用户维度, 但是不需要用户表的参与, 意味着没有这个维度表

维度表的分类:

  • 高基数维度表: 指的表中的数据量是比较庞大的, 而且数据也在发生的变化

    例如: 商品表, 用户表

  • 低基数维度表: 指的表中的数据量不是特别多, 一般在几十条到几千条左右,而且数据相对比较稳定

    例如: 日期表,配置表,区域表

8.维度建模的三种模型

  1. 星型模型
  • 特点: 只有一个事实表, 那么也就意味着只有一个分析的主题, 在事实表的周围围绕了多个维度表, 维度表与维度表之间没有任何的依赖
  • 反映数仓发展初期最容易产生模型
  1. 雪花模型
  • 特点: 只有一个事实表, 那么也就意味着只有一个分析的主题, 在事实表的周围围绕了多个维度表, 维度表可以接着关联其他的维度表
  • 反映数仓发展出现了畸形产生模型, 这种模型一旦大量出现, 对后期维护是非常繁琐, 同时如果依赖层次越多, SQL分析的难度也会加大
  • 此种模型在实际生产中,建议尽量减少这种模型产生
  1. 星座模型
  • 特点: 有多个事实表, 那么也就意味着有了多个分析的主题, 在事实表的周围围绕了多个维度表, 多个事实表在条件符合的情况下, 可以共享维度表
  • 反映数仓发展中后期最容易产生模型

9.缓慢渐变维(SCD)

缓慢渐变维,即维度中的属性可能会随着时间发生改变

解决办法:

  • SCD1: 直接覆盖, 不维护历史变化数据
    主要适用于: 对错误数据处理
  • SCD2:不删除、不修改已存在的数据, 当数据发生变更后, 会添加一条新的版本记录的数据, 在建表的时候, 会多加两个字段(起始时间, 截止时间), 通过这两个字段来标记每条数据的起止时间 , 一般称为拉链表
    好处: 适用于保存多个历史版本, 方便维护实现
    弊端: 会造成数据冗余情况, 导致磁盘占用率提升
  • SCD3: 通过在增加列的方式来维护历史变化数据
    好处: 减少数据的冗余, 适用于少量历史版本的记录以及磁盘空间不是特别充足情况
    弊端: 无法记录更多的历史版本, 以及维护比较繁琐

10.数据仓库分层

10.1为什么要分层?

分层可以使数据层次清晰、依赖关系直观

数据分层却可以给我们带来如下的好处:

  1. 清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解。
  2. 复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题。
  3. 便于维护:当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
  4. 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少重复开发的工作量。
  5. 高性能:数据仓库的构建将大大缩短获取信息的时间,数据仓库作为数据的集合,所有的信息都可以从数据仓库直接获取,尤其对于海量数据的关联查询和复杂查询,所以数据仓库分层有利于实现复杂的统计需求,提高数据统计的效率。

10.2数仓分层

  • ODS层: 源数据层

    作用: 对接数据源, 和数据源的数据保持相同的粒度(将数据源的数据完整的拷贝到ODS层中)

    注意:

    如果数据来源于文本文件, 可能会需要先对这些文本文件进行预处理(spark)操作, 将其中不规则的数据, 不完整的数据, 脏乱差的数据先过滤掉, 将其转换为一份结构化的数据, 然后灌入到ODS层

  • DW层: 数据仓库层

    作用: 进行数据分析的操作

    • DWD层: 明细层
      作用: 用于对ODS层数据进行清洗转换工作 , 以及进行少量的维度退化操作
      少量:
      1. 将多个事实表的数据合并为一个事实表操作
      2. 如果维度表放置在ODS层 一般也是在DWD层完成维度退化
    • DWM层: 中间层
      作用: 1) 用于进行维度退化操作 2) 用于进行提前聚合操作(周期快照事实表)
    • DWS层: 业务层
      作用: 进行细化维度统计分析操作
  • DA层: 数据应用层

    作用: 存储DW层分析的结果, 用于对接后续的应用(图表, 推荐系统...)

    例如:

    比如DWS层的数据表完成了基于订单表各项统计结果信息, 但是图表只需要其中销售额, 此时从DWS层将销售额的数据提取出来存储到DA层

  • DIM层: 维度层

    作用: 存储维度表数据

10.3什么叫做维度退化?

维度退化是为了减少维度表的关联工作

复制代码
做法: 将数据分析中可能在维度表中需要使用的字段, 将这些字段退化到事实表中, 
这样后续在基于维度统计的时候, 就不需要在关联维度表, 事实表中已经涵盖了维度数据了

例如:	订单表, 原有订单表中只有用户id, 当我们需要根据用户维度进行统计分析的时候, 
此时需要关联用户表, 找到用户的名称, 那么如果我们提前将用户的名称放置到订单表中, 
那么是不是就不需要关联用户表, 而则就是维度退化

好处: 减少后续分析的表关联情况
弊端: 造成数据冗余

11.构建数据仓库相关组件

11.1oozie

  1. 什么是oozie

    Oozie是一个用于管理Apache Hadoop作业的工作流调度程序系统

    Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,是用来管理Hadoop作业,属于web应用程序,由Oozie client和Oozie Server两个组件构成,Oozie Server运行于Java Servlet容器(Tomcat)中的web程序。

  2. 什么是工作流?

    工作流(Workflow),指"业务过程的部分或整体在计算机应用环境下的自动化"。

  3. 能够使用工作流完成的业务一般具有什么特点呢?

  • 整个业务流程需要周期性重复干
  • 整个业务流程可以被划分为多个阶段
  • 每一个阶段存在依赖关系,前序没有操作, 后续也无法执行

如果发现实际生产中的某些业务满足了以上特征, 就可以尝试使用工作流来解决

11.2sqoop

一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中

相关推荐
Lee川12 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Lee川15 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i17 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有18 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有18 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫19 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫19 小时前
Handler基本概念
面试
Wect19 小时前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼20 小时前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼20 小时前
Next.js 企业级落地
前端·javascript·面试