数据仓库面试汇总

别等时光非礼了梦想. 提交于 2020-01-30 13:13:08

什么是数据仓库

数据仓库是面向主题的,集成的,相对稳定的,反应历史变化的数据集合,用于支持企业或组织决策分析处理

OLAP是多维数据库,主要用于多维分析

数据仓库和数据库的区别

数据库是面向事务的,数据由日常产生,存储当前交易数据,一般设计要符合三范式

数据仓库是面向主题的, 数据来源于数据库或文件等,一般存储历史数据, 经过一定的规则转换得到,用来分析的,其设计一般是星型的,有利于查询

数据仓库的基本架构是什么/说一说你整个项目从数据采集到指标、报表的这整个过程是怎么做的

数据源->ETL->数据存储与管理->OLAP->BI工具

数据源:企业的各类信息,包括存放RDBMS关系型数据库中的各种业务处理数据和各类文档数据,市场信息,竞争对手的信息等等

数据存储与管理:这是整个数据仓库的核心,针对各业务系统的数据,进行抽取,清理,并有效集成,按照主题进行组织, 按覆盖范围可分为企业级数仓和部门级数仓

OLAP服务器:对需要的数据进行有效集成,按多维模型组织,以便多角度,多层次分析,并发现趋势,具体可分为:

ROLAP:关系型在线分析处理

MOLAP:多维在线分析处理

MOLAP:混合型线上分析处理

模型设计的思路:一是自上而下,一是自下而上 推崇自下而上, 建设数据仓库应该按照实际的应用需求,加载需要的数据,不需要的数据不要加载到数据仓库中

数仓建模的四步:

1.选择业务过程

比如电商项目要完成: 启动app,搜索,登陆,点击,下单,加购物车,支付,退货,评价,点赞,收藏,发货 以后生成的事实表 业务模块

2.声明粒度

按照时间的最小粒度

3.确定维度

日期,地域,商品,用户,仓库,优惠卷,物流商家,设备,渠道,版本,操作系统 以后生成的维度表

4.确定事实

ods层从用户行为表和MySQL业务数据库里直接拿过来的 保持数据原貌

dwd层 确定维度表和事实表 并作维度退化, 围绕事实表,组建星型模型

dws层

设备总表: id 这一天干了什么 访客 来了不一定注册

用户总表:   首次登陆的时间,累计登陆的次数,最近30日登陆的次数

首次下单时间,累计下单次数,最近30日下单次数,末次下单时间

首次支付金额,累计支付金额,最近30日支付金额,末次支付金额

商品总表/宽表

数据分析OPLAP:

数据立方体:时间轴,地域轴,商品轴,等,就是维表,事实表要分析的字段,看起来就像多维立方体一样

数据立方体的操作:切片,切块,旋转,上卷,下钻

在数据立方体上选择某一维的操作叫切片,对二维或多维选择叫切块,主要是对where语句做工作,模拟sql如下:

切片: select Locates.地区,Products.分类,SUM(数量) from Sales,Dates,Products,Locates where Dates.季度 = 2 and Sales.Date_key = Date.Date_key and Sales.Locate_key = locates.locates_key and Sales.Product_key = Products.Product_key group by Locates.地区,Products.分类

切块:select Locates.地区,Products.分类,SUM(数量) from Sales,Dates,Products,Locates where  (Dates.季度 = 2 OR Dates.季度 = 3) AND(Locates.地区 ='江苏ORLocates.地区=‘上海’) and Sales.Date_key = Date.Date_key and Sales.Locate_key = locates.locates_key and Sales.Product_key = Products.Product_key group by Dates.季度, Locates.地区,Products.分类

旋转就是指改变报表或页面的展示方向,从sql上来说就是改变select后面字段的顺序而已

上卷就是不看某些维度, 下钻就是将某些维度进行细分,主要是对group by语句的工作

留存分析,漏斗分析,事件分析,用户分析,粘性分析,全行为路径分析

数据质量监控:

1.单表数据量监控

一张表的记录数在一个已知的范围内,或者上下浮动不会超过某个阀值

sql结果:var 数据量 = count(昨天)

数值检测:如果数据量不在[数值上限,数值下限],则触发报警

同步增加:如果(今天的数据量 - 上周的数据量)/上周的数据量*100)不在[比例下线, 比例上限]则触发报警

环比增加:如果(今天的数据量 - 昨天的数据量)/昨天的数据量*100)不在[比例下线,比例上限],则触发报警

阀值配置的六个数值当中,至少配置一个阀值,对于没有配置的阀值,不做监控

2.单表空值监控

某个字段为空的记录数在一个范围内,或者占总数量的百分比在某个阀值范围内

目标字段:选择要监控的字段,不能选"无"

sql结果:var 异常数据量 = count(目标字段为空的记录)

单次检测:如果(异常数据量)不在[数值上限,数值下限],则触发报警

3.单表重复值检测:

一个或多个字段是否满足某些规则

目标字段:选择要监控的字段,groupby这里的字段列表,没有重复

单词检测:如果(异常数据量)不在[数值上限,数值下限],则触发报警

4.单表值域检测

一个或多个字段没有重复记录

目标字段:选择要监控的字段,支持多选

检测规则:填写"目标字段"要满足的条件.其中$1表示第一个目标字段,$2第二个目标字段,以此类推

阀值配置与空值检测相同

5.跨表数据量对比

主要针对同步流程,监控两张表的数据量是否一致

sql结果:count(本表)-count(关联表)

阀值配置与空值检测相同

6.跨表主外键对比

监控字段和关联字段:需要符合外键约束的两个字段

阀值配置与"空值检测"相同

拉链表是怎么实现的/缓慢变化维你们是怎么处理的?

拉链表主要用于数据会发生变化,但是大多数的数据是缓慢变化的

拉链表的使用:生效开始日期<=某个日期 且 生效结束日期 >= 某个日期,能够得到某个时间点的数据全量切片

例: select * from order_info where stat_date<=‘2020-01-01’ and end_date>=‘2020-01-01’

1.建立拉链表, 字段与MySQL中一致,表末加上start_date有效开始日期和end_date有效结束日期

2.通过insert overwrite table 表名 select 字段 , ‘2020-01-01’ ,‘9999-99-99’ from 表名 where 分区 初始化拉链表

3.创建临时拉链表, 订单变化表 union all(初始拉链表 left join 订单变化表)    left join条件是,如果历史拉链表中没有订单变化表例的数据,就是新增数据,否则为变化数据…订单变化表中id在初始拉链表中不存在,为null,即为新增数据,则这条数据的结束日期就是该条数据的结束日期,不需要改变。 订单变化表中id在初始拉链表中存在,不为null,即为需要变化数据,则这条数据的添加到拉链表中时,要将id相同的上一条数据的日期的9999-99-99改成date_add(oi.dt,-1),即新的这条数据的前一天的日期

4.把临时拉链表覆盖给拉链表

udf, udaf, udtf怎么写,分哪几个步骤,怎么转换成mr的?

udf 输入一行数据输出一行数据 Java代码中继承UDF, 实现evalute方法

udaf 输入多行数据输出一行数据,一般在group by 中使用 Java代码中继承UDAF, 实现init(初始化),iterate(函数处理读入行数据),terminatePartialfal(返回iterate处理的中间结果), merge(合并上述处理结果),terminate(返回最终结果)

udtf 实现一行输入多行输出 Java代码中继承GenericUDTF, 实现如下方法: initialize(初始化校验参数是否正确), process(处理返回结果), forward(将结果返回)

hive容易出现数据倾斜的操作:

这里写图片描述 解决办法:

sql的join操作: 驱动表, 选用join key分布最均匀的表作为驱动表; 做好列裁剪和filter操作两表做join的时候,数据量相对变小; 将小表进行缓存, 在map端完成reduce; 大表join大表时, 将空值附上随机数, 分配到不同的reduce上 如果优化效果不大, 可以将数据倾斜的数据,单独拿出来进行处理, 最后union

sql的group by操作: 用group by 替换count(Distinct),

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!