浅谈离线数仓ADS层

ADS层是由需求指标形成的,也就是由需求决定的,而其他层级的数据大部分是由ADS层来决定的。然后ADS层的数据大部分都是来自于DWD、DWS关联DIM层,一般一个原型图对应着一张ADS层的表,而ADS层的表里面的指标,来源于多张业务事实表,一般都需要从多个DWD或者DWS层的表中获取对应的指标字段,而且一般都需要关联DIM层的维度,所以就需要多个insert从多张事实表中获取原型指标字段。

获取原型指标字段数据的方法是,建一张tmp临时的ADS层表,然后通过多个insert语句从DWD层或者DWS层关联DIM层的表中来获取需要的ADS层的某一个或者多个指标字段,这些字段在bi原型中需要使用到的,插入到临时表中,得到的表会是一层一层的,而且每一层都有null值,且出现维度冗余,因为不可能ADS层的指标数据都从一张业务事实表获取到的,所以只能通过多张事实表来插入。最后就是写总的insert语句,将维度合并,减少冗余,得到最简的ADS层表以提高检索效率。

现在根据原型“征订目录教材教辅-供应链汇总表”,提取到了ads层的需求指标表“ads_subs_chain_sum”,现在需要根据这个ads层的表从dwd或者dws或者关联dim表进行获取ads层中的指标字段。有一些字段可以从某层中直接获取,有一些则需要经过聚合或者分组才能得到对应的指标字段。

现在他做的就是将ads层的表,分多个insert插入到一个tmp表中,然后获取到指标需要的所有字段数据,就是一层一层的拼接到一起,但是有些维度会重合,最后再对此tmp表进行分组合并维度得到对应合并后的数据插入到ads层的表中。

关联到相关的dim维度,然后将维度得到指标表的字段数据。维度都要,因为后续需要通过维度来合并数据。

由多个insert语句从不同的事实表中获取字段插入到tmp表,最后再对临时表进行合并维度得到指标表。

案例代码:

ADS层的表:ads_honry

建一张ADS层临时表tmp_ads_honry

每次采集时都清空一下临时表,最后再将整理好的指标插入到正式指标表中。

truncate table tmp_ads_honry

临时的获取d指标字段的insert语句:

insert into tmp_ads_honry

select

a , -- 维度字段a

b , -- 维度字段b

c , --维度字段 c

sum(d) -- 原型指标d

null e -- 原型指标e

null f  -- 原型指标f

from dwd_honryd left join dim_honry

group by a,b,c

临时的获取e指标字段的insert语句:

insert into tmp_ads_honry

select

a , -- 维度字段a

b , -- 维度字段b

c , --维度字段 c

null d -- 原型指标d

sum(e) -- 原型指标e

null f  -- 原型指标f

from dwd_honrye left join dim_honry

group by a,b,c

临时的获取f指标字段的insert语句:

insert into tmp_ads_honry

select

a , -- 维度字段a

b , -- 维度字段b

c , --维度字段 c

null d -- 原型指标d

null e -- 原型指标e

sum(f)  -- 原型指标f

from dwd_honryd left join dim_honry

group by a,b,c

总的ads表

insert into ads_honry

a , -- 维度字段a

b , -- 维度字段b

c , --维度字段 c

sum(d) -- 原型指标d

sum(e) -- 原型指标e

sum(f)  -- 原型指标f

from dwd_honryd left join dim_honry

group by a,b,c

<think>好的,用户想了解离线数据仓库项目的构建、设计和实现方案。首先,我需要整理一下离线数仓的基本概念和常见架构。通常离线数仓会采用分设计,比如ODS、DWD、DWS等,每有不同的作用。然后,用户提供的引用内容提到了元数据管理、指标体系的重要性,还有分重构的问题,这些都需要在回答中体现。 接下来,要确保回答结构清晰,分步骤说明构建方法。可能需要包括项目规划、架构设计、数据建模、技术选型、实现步骤和优化策略。每个部分需要结合用户提供的引用内容,比如在架构设计中强调分的必要性,引用[3]提到的分重构问题,可以说明如何设计灵活的分以便后期优化。 数据建模部分,需要提到维度建模和事实、维度的设计,引用[2]中的指标体系,说明建立统一指标的重要性,避免需求膨胀。技术选型方面,Hadoop、Hive、Spark这些组件是常用的,可以列举出来,同时引用[1]提到的元数据管理工具,如Atlas。 实现步骤要详细,从数据采集到分处理,再到数据应用,每个步骤需要具体说明。优化策略部分,可以引用分重构和模型建设的建议,强调前期设计的重要性,避免后期调整困难。 最后,生成相关问题,要围绕离线数仓的设计挑战、技术选型考量、指标体系作用、元数据管理方法以及性能优化策略。确保问题覆盖用户可能感兴趣的各个方面,帮助他们深入理解。 检查是否遵循了系统级指令,数学公式用$...$,独立公式用$$...$$,但当前内容可能不需要数学公式。确保使用中文,回答结构清晰,引用正确添加。比如在提到分设计时,引用[3],元数据应用引用[1],指标体系引用[2]。 现在,组织这些内容,确保逻辑连贯,步骤明确,引用自然融入,最后提出相关问题。</think>### 离线数据仓库项目构建与设计方案 #### 一、核心设计原则 1. **分架构设计** 离线数仓通常采用经典分模型: $$ODS \rightarrow DWD \rightarrow DWS \rightarrow ADS$$ 其中: - **ODS**(操作数据存储)直接对接原始数据,保留业务系统原貌[^3] - **DWD**(明细数据)进行数据清洗、标准化和维度退化 - **DWS**(汇总数据)按主题域构建宽 - **ADS**(应用数据)面向具体业务场景输出指标 2. **指标体系先行** 建立统一的业务指标定义规范,遏制需求膨胀问题。例如电商场景需明确"GMV=订单金额-退款金额+运费"等计算口径[^2]。 #### 二、实现方案关键步骤 1. **数据采集与存储** - 使用Sqoop/DataX完成结构化数据同步 - 通过Flume采集日志类非结构化数据 - 存储选择HDFS+Hive组合,支持大规模数据批处理 2. **分建模实现** ```sql -- DWD示例(订单事实) CREATE TABLE dwd_order_fact ( order_id STRING COMMENT '订单ID', user_id BIGINT COMMENT '用户ID', total_amount DECIMAL(16,2) COMMENT '订单金额', dt STRING COMMENT '分区日期' ) PARTITIONED BY (dt STRING); ``` 3. **元数据管理** 采用Apache Atlas实现: - 数据血缘追踪 - 指标口径版本管理 - 生命周期监控[^1] #### 三、优化策略 1. **分重构技巧** 在DWD预置通用维度组合,后期通过视图实现逻辑分剥离,降低物理重构成本。 2. **模型建设规范** - 事实采用星型模型 - 维度使用缓慢变化维类型2 - 重要指标实现跨打标,保障一致性 #### 四、典型技术栈选型 | 级 | 组件 | |------------|------------------------| | 数据采集 | Sqoop, Flume, Kafka | | 存储计算 | HDFS, Hive, Spark | | 任务调度 | Airflow, DolphinScheduler | | 元数据管理 | Atlas, DataHub |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值