数仓理论入门级

一、数据仓库

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。
数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。
它是单个数据存储,出于分析性报告和决策支持目的而创建。
为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

一堆数据集合 log类型(insert) db关系型(insert update delete)
挖掘有效价值 report(静态报表 动态报表 运营)、实时大屏、对其他业务系统提供指标计算(智能分单 包装方案智能推荐)、钉钉应用(IDSS)
提供企业决策

以ERP为例

各仓库每小时订单量
各仓库每天订单量 (每小时汇总)
各仓库各个供应商每小时订单量
各仓库各个供应商每天订单量(每小时订单量)

底层存储只需要:各仓库各个供应商每小时订单量
B01 供应商1 2019-10-01 00 1000
B02 供应商2 2019-10-01 00 2000
B01 供应商1 2019-10-01 01 3000
B01 供应商1 2019-10-02 00 3000
一般存储 只存储最小粒度的多维汇总数据

上钻下钻
仓库每天的订单量
仓库每月的订单量
仓库的各个供应商的每月的订单量
会自动拼接 sql ==》group by

二、集市

数据集市(Data Mart) ,也叫数据市场,
数据集市就是满足特定的部门或者用户的需求,按照多维的方式进行存储,
包括定义维度、需要计算的指标、维度的层次等,生成面向决策分析需求的数据立方体。
从范围上来说,数据是从企业范围的数据库、数据仓库,
或者是更加专业的数据仓库中抽取出来的。
数据中心的重点就在于它迎合了专业用户群体的特殊需求,
在分析、内容、表现,以及易用方面。数据中心的用户希望数据是由他们熟悉的术语表现的。

是数仓的一个子集

数据仓库 数据集市
企业级别 部门级别
大量的全的数据 仅自己的数据

三.数仓分层

ODS(operation data store) 原始数据层 存放原始数据 不做任何的处理
DWD/DWI(data warehouse detail) 结构和粒度与ODS层是一致的,只做对ODS层数据进行清洗(脏数据 空值) 拉链表 脱敏 手机号 银行卡 密码(mysql加密)
DWS(data warehouse service) 以DWD层为基础 进行轻度汇总 宽表(join)
ADS/APP/domain域表(application data store) 按主题提供统计数据(group计算 少量可能做join计算取决于宽表没有你想要的字段)
上–》下游数据量

四、为什么要分层

复杂问题简单化: 将一个超级复杂的任务进行分解成多个步骤来完成,
每一层只处理单一的步骤,比较简单,方便定位问题

减少重复开发:规范好数仓的分层,通过中间层的数据,能够减少重复计算,增加一次计算的复用。

隔离原始数据: 数据的敏感,使得真实的数据 和统计的数据 分离

数据仓库的分层不是越多越好,
合理的层次设计,以及计算成本 和人力成本的平衡,
是一个好的数仓架构的表现。

五、主表明细表设计案例

订单全表

订单主表+明细表

订单主表+明细表+商品表 生产上 上游MySQL的设计

mysql: --> hive ods层+dwd层 --》hive dws层
orderinfo orderinfo order
orderitems orderitems

天下分分合合 合合分分

<think>首先,用户的问题是关于“基础数仓开发项目推荐”,参考了之前的对话。在之前的对话中,我解释了在库项目中是否需要Java,结论是对于基础数仓开发,如FDM层建设,不需要Java,重点在SQL和业务理解。 用户提供的引用包括: - 引用[1]:关于库开发过程,包括建立据模型、定义记录系统、设计主题领域、接口设计等。 - 引用[2]:一个SQL示例,用于商品品牌分组topN需求,展示了插入据和排序。 用户的上一个问题也是关于基础数仓开发项目的推荐,所以我需要基于此推荐一个基础项目。 系统指令要求: - 所有行内学表达式用$...$。 - 独立公式用$$...$$并单独成段。 - 正确使用LaTeX语法。 - 用中文回答。 - 生成相关问题。 - 在引用的段落末尾自然添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题,真实可靠。 我的回答结构应该清晰。回顾之前的回复,我有标题、分析点、表格、建议等。现在用户要的是项目推荐,所以我应该推荐一个具体的基础数仓开发项目。 内容基于引用: - 引用[1]提到库开发的关键步骤:建立据模型、定义记录系统、主题领域组织、设计接口、载入主题领域。 - 引用[2]是一个SQL示例,用于topN查询。 - 之前的回答中提到FDM层(主题模型层)建设是最核心的,不需要Java。 所以,推荐的项目应该聚焦于基础数仓开发,如创建一个主题领域的据模型,实现ETL过程使用SQL。 项目推荐思路: - 目标:让用户实践基础库开发。 - 项目主题:选择一个常见主题,如销售分析、用户行为分析等。 - 步骤:基于引用[1],涵盖建模、ETL设计、SQL实现。 - 工具:使用SQL为主,例如在MySQL、PostgreSQL或云据库如BigQuery上实施。 - 示例:类似引用[2]的topN查询,但扩展到整个ETL流程。 项目推荐框架: 1. **项目概述**:描述项目的目的和主题。 2. **关键步骤**:基于库开发过程,分解步骤。 - 步骤1: 理解业务需求(如分析销售据)。 - 步骤2: 设计据模型(如星型模式或雪花模式)。 - 步骤3: 定义ETL过程(使用SQL实现据抽取、转换、加载)。 - 步骤4: 开发和测试(包括编写SQL查询)。 - 步骤5: 部署和反馈。 3. **技术栈**:推荐SQL作为核心,Python用于脚本(如调度),不涉及Java。 4. **示例任务**:提供一个类似引用[2]的具体SQL任务作为项目的一部分。 5. **学习资源**:建议免费工具如MySQL、dbt(SQL-based ETL工具)。 确保引用:在描述步骤时,自然引用引用[1],因为它描述了开发过程。 生成相关问题:在结束时,添加相关问题部分。 结构: - 标题:"基础数仓开发项目推荐" - 正文:清晰步骤。 - 代码块:如提供一个SQL示例。 - 相关问题列表。 LaTeX使用:如果有学表达,比如在优化中,但在这个主题可能不多。如果有,确保格式正确。例如,在描述据模型中的关系时,可能用$table_{name}$,但避免不必要的复杂。 最终输出: - 用中文。 - 结尾有相关问题。 </think>### 基础数仓开发项目推荐 基于您之前的查询和引用内容,我为您推荐一个**基础库开发项目**,聚焦于核心主题领域(如FDM层建设),该项目无需Java,主要依赖SQL和业务建模能力。推荐项目基于库标准开发过程[^1],包括模型设计、ETL开发、主题领域实现等,确保真实可行且适合初学者入门。项目选择**销售分析主题**(常见于电商或零售),因为它易于理解且能覆盖关键技能点。 #### 项目名称:电商销售主题库建设 **项目目标**:构建一个简单库,分析商品销售据,实现主题模型整合(如商品品牌topN排行)。通过此项目,您将掌握据建模、SQL ETL开发和需求实现。 **技术栈**: - 据库:MySQL(免费开源)或BigQuery(云平台免费层) - ETL工具:SQL为主(替代Java);可选Python脚本(用于调度) - 建模工具:Lucidchart(免费在线工具)设计模型 **预计时长**:1-2周(适合自学或小团队实践) #### 关键开发步骤(基于库开发过程[^1]) 本项目严格遵循引用[1]中描述的流程:建立据模型→定义记录系统→设计主题领域→接口设计→载入主题领域→反馈循环。以下是详细步骤和实操指南: 1. **建立据模型(主题领域设计)** - **业务需求**:分析商品销售据,实现“品牌分组销量topN”(类似引用[2])。 - **模型设计**:采用**星型模型**(基础数仓常见)。 - 事实表:`fact_sales`(包含销售事件,如`sale_id`, `sku_id`, `sale_date`, `quantity`, `amount`) - 维度表: - `dim_sku`(商品维度,如`sku_id`, `sku_name`, `brand_id`) - `dim_brand`(品牌维度,如`brand_id`, `brand_name`) - `dim_date`(时间维度,如`date_id`, `year`, `month`) - 模型可视化:使用Lucidchart绘制ER图(参考FDM层主题划分原则[^1])。 - **输出**:SQL DDL语句创建表结构。 ```sql -- 创建维度表 dim_brand CREATE TABLE dim_brand ( brand_id INT PRIMARY KEY, brand_name VARCHAR(50) ); -- 创建事实表 fact_sales CREATE TABLE fact_sales ( sale_id INT PRIMARY KEY, sku_id INT, brand_id INT, sale_date DATE, quantity INT, amount DECIMAL(10,2), FOREIGN KEY (sku_id) REFERENCES dim_sku(sku_id), FOREIGN KEY (brand_id) REFERENCES dim_brand(brand_id) ); ``` 2. **定义记录系统与ETL接口设计** - **记录系统**:假设源据来自操作型据库(如MySQL的`orders`表),需定义接口抽取据。 - **ETL过程**(SQL为主,无需Java): - **抽取(Extract)**:从源表读取据(例如每日增量)。 - **转换(Transform)**:清洗、聚合(如计算销售额)。 - **加载(Load)**:写入库表;使用SQL实现全流程[^1]。 - **示例SQL接口**(每日增量加载): ```sql -- 抽取与转换:从源表 orders 到临时表 INSERT INTO temp_sales (sale_id, sku_id, sale_date, quantity, amount) SELECT order_id, product_id, order_date, quantity, price * quantity FROM orders WHERE order_date = CURDATE(); -- 加载:将临时表据插入事实表 INSERT INTO fact_sales (sale_id, sku_id, brand_id, sale_date, quantity, amount) SELECT ts.sale_id, ts.sku_id, ds.brand_id, ts.sale_date, ts.quantity, ts.amount FROM temp_sales ts JOIN dim_sku ds ON ts.sku_id = ds.sku_id; ``` 3. **实现主题领域与核心需求(载入与反馈)** - **主题领域**:专注“商品销售分析”,载入首个主题(引用[1]强调的迭代过程)。 - **需求实现**:商品品牌分组topN(参考引用[2])。 - **SQL查询示例**(类似引用[2]的ads层实现): ```sql -- 每个品牌下销量top10的sku(基于事实表聚合) INSERT INTO ads_brand_sale_topN (dt, brand_id, sku_id, total_sales) SELECT '2023-10-01' AS dt, -- 替换为实际日期 ds.brand_id, fs.sku_id, SUM(fs.quantity) AS total_sales FROM fact_sales fs JOIN dim_sku ds ON fs.sku_id = ds.sku_id WHERE fs.sale_date = '2023-10-01' -- 过滤特定日期 GROUP BY ds.brand_id, fs.sku_id ORDER BY total_sales DESC LIMIT 10; -- 每个品牌取top10 ``` - **优化**:添加分区索引提升性能(例如在`sale_date`上创建索引)。 - **反馈循环**:运行查询后,验证据准确性(如对比源系统),调整模型或ETL逻辑[^1]。 4. **项目扩展与工具建议** - **调度**:用Python脚本(Airflow)定时运行ETL,无需Java。 - **测试据**:使用Mock据生成工具(如Python Faker库)。 - **免费资源**: - 据库:MySQL Community Edition - ETL:dbt(SQL-based工具,支持版本控制) - 云平台:Google BigQuery免费层(处理TB级据) - **成功关键**:关注业务理解(如品牌分析需求)和SQL优化,而非编程语言。 #### 项目收益 - **技能提升**:掌握据建模、SQL ETL开发,覆盖80%基础数仓任务(无需Java)。 - **真实案例借鉴**:基于电商销售主题,可直接应用于中小企业场景[^1][^2]。 - **风险评估**:若源据质量低,需增强清洗逻辑(使用SQL CASE语句处理缺失值)。 > 📌 **总结**:此项目完全**依靠SQL和建模理论**,贴合基础数仓开发(FDM层主题建设)[^1]。通过实践,您将理解引用[2]中的topN需求如何融入完整ETL流程。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值