ETL面试题01
一、基础概念与理论类
1. 请解释什么是 ETL?它在数据处理流程中扮演什么角色?
答:ETL就是数据抽取、转化、加载。目的是将分散的数据源集中在一起进行处理分析。
数据抽取:是指各种数据源中抽取数据,包括关系型数据库(MySQL、Oracle等)、日志文件、Excel、非关系型数据库、流失数据(kafka)等等,可以是全量抽取也可以是增量抽取。
数据转化:是指将抽取到的数据进行清洗、格式转化、数据整合、业务规则计算等等操作,使数据符合目标数据存储的格式和业务需求,是最为复杂的步骤。
数据加载:将清洗转化后的高质量数据加载到目标数据存储中,例如数据仓库(hive等)、数据湖,可以实现全量加载、增量加载、分区加载等,以供后续分析和应用。
ETL在数据处理流程中有重要作用:它将多个数据源进行整合统一,将数据进行转化清洗,提升数据的质量,还能够支持数据分析与业务决策,从数据中发现业务规律与问题,同时ETL工具也可以实现自动化数据流程,保证数据的时效性。
2. ETL 和 ELT 有什么区别?分别适用于哪些场景?
答:这两者主要是操作步骤顺序的不同。
ETL:先将数据转化后再加载到目标数据存储当中,转换依赖ETL工具的计算能力,适合数据量较小的场景。
ELT:先将原数据加载到目标数据存储后,再将数据进行转换计算,可以利用目标存储的分布式计算能力(Spark)进行转换,更适合海量数据处理。
3. 什么是数据仓库?它与数据库的区别是什么?ETL 在数据仓库中起到什么作用?
答:数据仓库是一个面向主题的、集成的、非易失的、随时间变化的数据集合,主要的作用是支持企业的决策分析。
数据仓库的数据都是围绕业务主题组织,它集成了多个数据源,例如数据库、文件、日志等,通常数据一旦进入数据库,是不会被频繁修改的,主要是用来查询分析而不是事务处理。数据会按照时间维度存储历史快照,支持趋势分析。
4. 维度建模中的事实表和维度表有什么区别?各有哪些类型?
答:事实表是业务指标的载体,记录发生了什么;维度表是业务的上下文信息,用来记录人物时间地点、如何发生等。二者通过外键形成层关联,形成“星型模型”或“雪花模型”,支撑灵活的多为分析。
事实表:存储业务过程中可以量化的指标,如销售额、订单数,记载业务流水,数据特点是数据量大、更新频繁。按照数据颗粒度和业务场景可以分为:事务事实表(最常见的订单事务表)、周期快照表(记录固定时间点的业务状态,如每日库存快照表)、累积快照事实表(从业务过程的开始到结束的全生命周期记录)、无事实事务表(记录事件的发生或关系的存在,如浏览记录表)。
维度表:存储描述性信息,如用户、时间地点等,数据量少、更新频率低。按结构和更新方式可分为:常规维度表(如商品维度表)、缓慢变化维度表(处理维度随时间缓慢变化的场景有需要保留历史状态支持回溯,如商品分类调整表)、快速变化维度表(维度属性频繁变化,如:商品实时评分)、角色扮演维度表(同一维度在事实表中扮演多个角色,通过不同外键区分)、退化维度表(维度直接存储在事实表中,不单独创建维度表,通常是事务编号等无复杂描述的字段,例如订单事实表中的订单号)
5. 什么是缓慢变化维度(SCD)?常见的 SCD 类型有哪些,分别适用于什么场景?
答:缓慢变化维度就是可能会随时间缓慢变化的维度,例如年龄、住址变更、商品分类变更等。常见的SCD类型主要是根据业务历史数据进行设计的,主要是业务对于历史数据的需求。
直接覆盖型:不保留历史数据,直接覆盖新值,实现简单节省空间。例如数据错误修正,无需保留错误值。
新增版本型:属性变化时,旧记录保存,新增一条记录值,通过版本号或者时间戳记录有效性。完整保留历史版本,支持任意时间点的回溯。适用于历史状态有分析价值和需追踪属性的全生命周期的场景。
有限历史型:在维度表中新增字段存储最近的一次历史值,进保留有限的历史版本,实现简单,历史记录有限,适合只需要比对“当前状态与上一状态”的场景,例如商品单价调整,当前单价与上一单价。
历史表分离型:用两个表存储维度数据,主表存储最新数据,历史表存储所有的历史变更,记录时间戳。特点是当前数据查询高效,合适高频查询当下与低频查询历史的场景。
混合型:场景复杂,综合上述类型的特点。
6. 数据清洗的主要目的是什么?常见的数据质量问题有哪些,如何处理?
答:数据清洗的目的是消除原数据中的错误、不一致或无用信息,得到高质量、可靠的数据,包括确保数据的准确性、完整性、一致性(格式/逻辑一致)和有效性(符合业务规则),消除冗余或重复数据,减少存储和计算资源,更贴合业务场景。
常见的数据质量问题:
- 数据缺失:例如字段为空,可能是数据采集遗漏或系统故障等。可以通过填充、删除、标记等方式,填充可以采用均值、中位数或者众数填充,也可以通过时间序列用前后值插值的方式或者用业务逻辑推导,需要根据实际业务进行判断调整。若是比例较大且无用的字段可以直接删除或者标记“未知”、”N/A“,保留原始状态。
- 数据重复:存在完全相同或核心信息重复的记录,会导致分析结果偏差。可以通过唯一标识或者组合标识进行去重,或者通过逻辑进行重复记录合并(记录的字段存在差异)
- 数据错误(值不符合实际):字段值不符合业务逻辑或常识。可以通过业务规则进行校验修正,联系数据源,对于极端值先确认是否为真实业务数据,若有误可以标记或删除,格式问题可以直接调整格式。
- 数据不一致:同一实体的信息在不同的数据源中存在矛盾,可能由于数据源不同步、业务规则不同意、字段定义模糊导致。可以采用统一格式、逻辑校验、主数据管理等方式确保数据同一。
- 数据冗余:存在不必要的重复字段或无关信息,可以选择直接删除冗余字段,同时规范化存储。
- 数据无效:数据不符合业务场景的有效性,例如“已取消的订单”却有“发货时间”。直接过滤无效记录,通过业务流程校验,修正逻辑错误。
7. 什么是数据血缘?它在 ETL 过程中的作用是什么?
答:数据血缘就是描述数据从源头产生到最终消费的全生命周期的流转路径以及各环节之间的依赖关系的记录,类似于”家谱“,展示数据从哪里来(源系统、原始表),经过了那些处理(ETL转换、计算逻辑、过滤规则)、最终到哪里(目标表、报表等)
数据血缘是数据从分散数据到目标存储的核心流转过程,可以帮助我们进行问题排查与故障定位,因为ETL涉及到多核环节的流转,若是最终数据存在异常可以通过数据血缘快速追溯;保障数据质量和合规性;分析步骤变更影响,例如中间某一个环节需要调整,可以快速判断出下游那些表也会受到影响以及可能存在的风险;便于数据资产管理和跨团队协作,快速对齐数据定义。
二、工具与技术类
1. 你常用的 ETL 工具有哪些(如 DataStage、Informatica、Kettle、Talend 等)?请介绍一下它们的特点和使用场景。
答:常用的是Kettle工具。主要是因为Kettle开源免费,成本低,而且功能强大,支持多种数据源(数据库、文件、API、Hadoop等),