数仓实现过程

news/2025/3/15 1:13:46/

数仓实现过程
1、了解需求(包括原始数据结构)
2、提取指标(事实表)、维度(维度表)
3、分层设计
4、建模
5、分层实现


1、了解需求(包括原始数据结构)

2、提取指标和维度

3、设计分层
ODS:保留最完整的原始数据、外部表
DW:
    新零售项目:DWD、DWB、DWS、DM(教育项目:DWD、DWM、DWS)
    DWD:保证数据高质量,进行清洗转换;
    DWB:明细宽表,降维冗余,雪花模型——》星型模型;
    DWS:日统计宽表,按天进行轻度聚合;
    DM:数据集市,总累积、年、季度、月、周、天;等同于教育项目的DWS层;
RPT/APP/DA:OLAP应用层

教育项目分层:ODS、DWD、DIM、DWM、DWS、APP
    DIM:维表层,维度表,维度数据的统一口径;
    DWM(middle):中间组件层:1、明细宽表,减少join;2、轻度聚合,日统计宽表;
    DWS(service):数据集市:粗粒度的聚合汇总

4、建模
ODS-》字段保持和原始数据一致,增加抽取日期作为分区;
DWD-》1、增加转换后的字段:年、季度、月、周;2、拉链表字段:生效日期、封链日期;
DWB(教育DWM)-》将关联表的字段,都放进来;关系紧密经常一起使用、副表数据量不能比主表大太多;
DWS(教育DWM)-》按照主题需求统计,字段包含了指标、维度、group_type;
DM (教育DWS)-》按照主题需求统计,字段包含了指标、维度、group_type、年、季度、月、周、日、time_type;
RPT(教育APP)-》个性化的需求,按照需求来走;

5、实现抽取计算
5.1、根据分层,进行功能实现
5.2、实现过程中,出现问题解决问题

ODS-》
    sqoop   首次:select * from table where 1=1 and $CONDITIONS
            循环:select * from table where (create_time between '2022-02-14 00:00:00' and '2022-02-14 23:59:59')
                                            or
                                            (update_time between '2022-02-14 00:00:00' and '2022-02-14 23:59:59')
                                             and $CONDITIONS
DWD-》
    清洗:根据不同表的业务,进行针对性的过滤:where buy_user is not null
    转换:枚举值转换、时间格式、单位统一、脱敏、Json拉平
    拉链表:生效日期、封链日期。会更新的表才需要用。查询拉链表和更新拉链表。

DWB(教育DWM)-》
    明细宽表,降维冗余。
    Left Join & Full Join ——》 数据重复
    关联原则:关系紧密经常一起使用、副表数据量不能比主表大太多、不断变化的
    主表 left join 副表 on ...
        left join 副表 on ...
        left join 副表 on ...
        left join 副表 on ...
    自关联:涉及到多层自关联的表,需要将各层均冗余到宽表中。 from table a left join table b on a.parent_id=b.id

DWS(教育DWM)-》
    日统计宽表,按天进行轻度聚合
   去重的方法: 1、distinct:针对单个字段去重;2、groupby:对全局数据生效,影响分组和聚合的结果;3、row_number+partitionby:对全局数据生效,不影响分组和聚合的结果
    -- ==================城市
    with rn_base (
        select 
            row_number() over(partition by order_id) rn
        from dwb
    )
    select 
        count(order_id), sum(order_price)
    from rn_base
    where rn=1
    group by dt, city;
    -- ==================商圈
    with rn_base (
        select 
            row_number() over(partition by order_id) rn
        from dwb
    )
    select 
        count(order_id), sum(order_price)
    from rn_base
    where rn=1
    group by dt, trade_area;
    -- ==================
    ……………… 
    grouping sets:
    场景:1、多个groupby;2、数据来源要一致。
    优点:1、合并后sql简短;2、只读取一次硬盘数据,性能提升。

DM -》
    年、季度、月、周、日
    -- =====time_type:year   group_type:all
    with groupby as
    (
        select sum(order_price),
            case when grouping(trade_area)=0
                then 'trade_area'
                when grouping(city)=0
                then 'city'
            END as group_type_new
        -- group_type:all、city、trade_area...
        from dws
        -- where dws.group_type='all'
        group by 
        grouping sets (
            (year),
            (year, city),
            (year, trade_area),
            (year_month),
            (year_month, city),
            (year_month, trade_area),
            ......
        )
    )
    SELECT * from groupby
    --        天数据的分组类型 = 年数据的分组类型
    where dws.group_type = group_type_new;

    -- 总累积、首末日期
    -- 累加的计算方式,不止是总累计值可以用、年、季度等都可以用:取舍在于性能和复杂度之间
    DM旧累计值 + 昨天新数据 = 新累计值
    性能更高、过程复杂;
    max(date) 首次日期
    min(date) 末次日期

RPT-》个性化操作


http://www.ppmy.cn/news/596091.html

相关文章

儒豹送笔记本活动开始了!!!!

限量版的奖品………………太好了!!!!!好激动!!!!!!不行,心动不如行动,赶紧去参加活动抢一个!!!!呵呵……这才是我的本色!&…

[精华]史上最强买笔记本电脑专业精粹导购指南,让奸商彻底晕菜!

史上最强买笔记本电脑专业精粹导购指南,让奸商彻底晕菜! 买笔记本电脑,要到其相应品牌的官方网站上找到当地的第一经销商,这样安全,同时参照这个导购指南: 测试笔记本所需的工具: http://ike.126.com U盘,耳机&a…

100美元笔记本全在中国生产 名为人人电脑

100美元笔记本全在中国生产 名为人人电脑作者: 新浪科技CNETNews.com.cn 2006-05-12 09:58 AM 图为:OLPC(人人电脑)协会顾问说宝堂CEO潘鹏凯(骆磊/摄) 新浪科技讯 2006 年5 月11日,OLPC(100 美元笔记本的研发协会)顾问…

Web3在HTML中获取 MetaMask 启用的用户列表

当然 我们还是要先启动ganache环境 然后 通过MetaMask 导入一些用户 然后 我们需要在页面中引入 web3.min.js 如果您还没有这个文件 可以查看我的文章web3.js获取导入 然后我访问官网 https://learnblockchain.cn/docs/web3.js/web3-eth.html#getchainid 打开后 先来到 web3.…

华为面试复习

hr给了大致的范围&#xff0c;然后我做了点答案的总结 C机试及面试手撕题参考复习范围 基本类型、函数和容器的使用 int long char string vector map queue set进制转换 二进制 std::bitset or bitset<n>() n是输出的位数 八进制 std::oct 十进制 std::d…

【从零开始学习JAVA | 第二十篇】常见API介绍 Math

目录 前言&#xff1a; MATH: Math类中的常用方法&#xff1a; 总结&#xff1a; 前言&#xff1a; 本篇往后我们会详细介绍一些常用的API&#xff0c;今天我们介绍的是Math的常用方法。但是其实我们不需要记住所有的方法&#xff0c;在日常工作中自己学会查询API文档就可以…

多线程 /C++ 11 std::thread 类深入理解和应用实践

文章目录 概述准确理解 joinable 属性a thread of execution 执行线程线程 active线程 joinable "可加入" 函数 join 和 函数 detach如何理解线程对象是被安全地销毁的native_handle 线程句柄std::thread类的其他接口常见错误错误 C2893错误 C2653 概述 C11 的引入标…

ChatGPT最新版带来的多功能批量写作工具激发您的创作

随着人工智能的不断发展&#xff0c;ChatGPT最新版作为一款多功能批量写作工具&#xff0c;为创作者们带来了前所未有的创作体验。它能够通过自然语言处理和机器学习技术&#xff0c;生成高质量的文章、故事、对话等内容&#xff0c;为创作者们提供了无限的创作灵感和可能性。本…