Python工业项目实战 04:数仓维度层DWS层构建

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python工业项目实战 04:数仓维度层DWS层构建相关的知识,希望对你有一定的参考价值。

知识点01:课程回顾

  1. ODS层与DWD层的功能与区别是什么?

    • ODS:原始数据层
      • 存储格式:AVRO
      • 数据内容:基本与原始数据是一致的
    • DWD:明细数据层
      • 存储格式:Orc
      • 数据内容:基于与ODS层是一致的
  2. ODS层的需求是什么?

    • 自动化建库建表

    • 建表

      create table one_make_ods.表名
      tableproperties(schema文件)
      
      • 表名
      • 表的注释
      • 表对应的HDFS地址
      • Schema文件的地址
  3. DWD层的需求是什么?

    • 自动化建库建表

    • 建表

      create table one_make_dwd.表名(
      	字段信息
      )
      location
      
      • 表名
      • 表的注释
      • 表对应的HDFS地址
      • 字段信息
  4. 怎么获取表的Schema信息?

    • 表的注释、Schema信息
    • ODS:Oracle中获取表的注释、Schema文件从Sqoop生成的
    • DWD:Oracle中获取表的信息
      • TableMeta:表名,表的注释,列的信息:List
      • ColumnMeta:列名、列的注释、列的类型、长度、精度
  5. 如何使用Python构建Oracle和Hive的连接?

    • Oracle:cx_Oracle
      • conn(host,port,user,passwd,sid)
    • Hive/SparkSQL:pyHive
      • SparkSQL用法
      • 编程方式:python文件 | jar包
        • 流程
          • step1:SparkSession
          • step2:读取数据源
          • step3:处理
            • 注册视图
            • spark.sql(“”)
        • spark-submit
        • 优点:灵活
        • 场景:DSL
      • 提交SQL:ThriftServer
        • 场景:SQL,调度开发
        • 流程
          • JDBC | PyHive | Beeline:代码中开发
          • spark-sql -f xxxx.sql:SQL文件的运行
  6. 如果实现SQL语句的执行?

    • step1: 先构建服务端的远程连接

      • 服务端地址:主机名 + 端口
      • 用户名和密码
    • step2:基于这个连接构建一个游标

    • step3:通过游标来执行SQL语句:execute(String:SQL)

    • step4:释放资源

  7. 集中问题

    • 连接构建不上
      • 映射不对:spark.bigdata.cn:Can not Connect[46.xxx.xxxx.xx,10001]
        • 修改host文件
        • 修改config.txt:node1
      • 服务端问题:spark.bigdata.cn:Can not Connect[192.168.88.100,10001]
        • Spark的TriftServer没有启动
          • 启动完成先用dg或者beeline先测试一下
        • ThriftServer:依赖于MetaStore + YARN
          • 检查YARN:本质就是一个Spark程序:实时程序,不停止的
      • Oracle:cx_Oracle + 本地客户端:D:\\instantclient_12_2
    • 安装
      • Python版本:Python 3.7.4
      • 命令sasl

知识点02:课程目标

  1. 回顾维度建模
    • 建模流程:划分主题域和主题
    • 维度设计:构建维度矩阵
    • 维度模型:雪花模型、星型模式
  2. 项目中的建模流程和维度设计
    • 划分了哪些主题域,每个主题域有哪些主题?
    • 每个主题基于哪些维度进行分析?
  3. 维度层构建
    • 时间维度
    • 地区维度
    • 油站维度
    • 服务网点维度
    • 组织机构维度
    • 仓库维度
    • 物流维度

知识点03:维度建模回顾:建模流程

  • 目标掌握维度建模的建模流程

  • 实施

    • step1-需求调研:业务调研和数据调研

      • 了解整个业务实现的过程
      • 收集所有数据使用人员对于数据的需求
      • 整理所有数据来源
    • step2-划分主题域:面向业务将业务划分主题域及主题

      • 用户域、店铺域
      • 商品域、交易域、
      • 客服域、信用风控域、采购分销域
    • step3-构建维度总线矩阵:明确每个业务主题对应的维度关系

    • step4-明确指标统计:明确所有原生指标与衍生指标

      • 原生指标:基于某一业务事件行为下的度量,是业务定义中不可再拆分的指标,如支付总金额

      • 衍生指标:基于原子指标添加了维度:近7天的支付总金额等

    • step5-定义事实与维度规范

      • 命名规范、类型规范、设计规范等
    • step6-代码开发

      • 实现具体的代码开发

      • 只要知道指标的计算方式,基于维度分组计算指标

  • 小结

    • 掌握维度建模的建模流程

知识点04:维度建模回顾:维度设计

  • 目标掌握维度建模中维度的设计

  • 实施

    • 功能:基于组合维度来更加细化我们的指标,来更加精确的发现问题
      • 指标如果不基于组合维度进行分析得到,指标的结果是没有意义的
    • 实现:开发中维度就是指标聚合时的分组字段
    • 特点
      • 数据量小
      • 很少发生变化
    • 采集方式:全量
    • 常见维度
      • 时间维度:年、季度、月、周、天、小时
      • 地区维度:国家、省份、城市
      • 平台维度:网站、APP、小程序、H5
      • 操作系统维度:Windows、Mac OS、android、Linux、ios
      • ……
  • 小结

    • 掌握维度建模中维度的设计

知识点05:维度建模回顾:维度模型

  • 目标掌握维度设计的常用模型

  • 路径

    • step1:雪花模型
    • step2:星型模型
    • step3:星座模型
  • 实施

    • 雪花模型

      • 设计:部分维度通过其他维度间接关联事实表
      • 优点:避免数据的冗余
      • 缺点:关联层次比较多,数据大的情况下,底层层层Join,查询数据性能降低

  • 星型模型

    • 设计:所有维度表直接关联事实表
    • 优点:每次查询时候,直接获取对应的数据结果,不用关联其他的维度子表,可以提高性能
    • 缺点:数据冗余度相比雪花模型较高

  • 星座模型

    • 星座模型:基于星型模型的演变,多个事实共同使用一个维度表

  • 小结

    • 掌握维度设计的常用模型

知识点06:一站制造业务主题划分

  • 目标掌握一站制造的主题域及主题的划分
  • 实施
    • 来源
      • 主题域划分:业务或者部门划分
        • 业务:客户域、广告域、运营域……
        • 部门:运维域、财务域、销售域……
      • 数据需求来划分主题
        • 运营域:访问分析报表、转化分析报表、用户属性分析报表、订单分析报表
    • 服务域
      • 安装主题:安装方式、支付费用、安装类型
      • 工单主题:派工方式、工单总数、派工类型、完工总数、
      • 维修主题:支付费用、零部件费用、故障类型
      • 派单主题:派单数、派单平均值、派单响应时间
      • 费用主题:差旅费、安装费、报销人员统计
      • 回访主题:回访人员数、回访工单状态
      • 油站主题:油站总数量、油站新增数量
    • 客户域
      • 客户主题:安装数量、维修数量、巡检数量、回访数量
    • 仓储域
      • 保内良品核销主题:核销数量、配件金额
      • 保内不良品核销主题:核销配件数、核销配件金额
      • 送修主题:送修申请、送修物料数量、送修类型
      • 调拨主题:调拨状态、调拨数量、调拨设备类型
      • 消耗品核销:核销总数、核销设备类型
    • 服务商域
      • 工单主题:派工方式、工单总数、工单类型、客户类型
      • 服务商油站主题:油站数量、油站新增数量
    • 运营域
      • 运营主题:服务人员工时、维修站分析、平均工单、网点分布
    • 市场域
      • 市场主题:工单统计、完工明细、订单统计
  • 小结
    • 掌握一站制造的主题域及主题的划分

知识点07:一站制造业务维度设计

  • 目标掌握一站制造业务维度设计

  • 实施

    • 日期时间维度
      • 年维度、季度维度、月维度、周维度、日维度
      • 日环比、周环比、月环比、日同比、周同比、月同比
      • 环比:同一个周期内的比较
      • 同比:上个个周期的比较
    • 行政地区维度
      • 地区级别:国家维度、省份维度、城市维度、县区维度、乡镇维度
    • 服务网点维度
      • 网点名称、网点编号、省份、城市、县区、所属机构
    • 油站维度
      • 油站类型、油站名称、油站编号、客户编号、客户名称、省份、城市、县区、油站状态、所属公司
    • 组织机构维度
      • 人员编号、人员名称、岗位编号、岗位名称、部门编号、部门名称
    • 服务类型维度
      • 类型编号、类型名称
    • 设备维度
      • 设备类型、设备编号、设备名称、油枪数量、泵类型、软件类型
    • 故障类型维度
      • 一级故障编号、一级故障名称、二级故障编号、二级故障名称
    • 物流公司维度
      • 物流公司编号、物流公司名称
    • ……
  • 小结

    • 掌握一站制造业务维度设计

知识点08:一站制造业务主题维度矩阵

  • 目标了解一站制造业务主题的维度矩阵

  • 实施

  • 小结

    • 了解一站制造业务主题的维度矩阵

知识点09:行政地区维度设计

  • 目标掌握行政地区维度的需求及设计

  • 路径

    • step1:需求
    • step2:设计
  • 实施

    • 需求:构建行政地区维度表,得到所有省份、城市、县区及乡镇维度信息

      • 省份维度表

        省份id	省份名称
        
      • 城市维度表

        省份id	省份名称	城市id	城市名称
        
      • 县区维度表

        省份id	省份名称	城市id	城市名称	县区id	县区名称
        
      • 乡镇维度表

        省份id	省份名称	城市id	城市名称	县区id	县区名称	乡镇id	乡镇名称
        11       北京市      1101     北京市      110108    海淀区    110108014  清华园街道
        
      • 统计不同地区维度下的网点个数、工单个数、报销金额等

    • 设计

      • 数据来源:one_make_dwd.ciss_base_areas

        select * from one_make_dwd.ciss_base_areas;
        
        • id:该地区数据id

        • parentid:该地区的父级行政区域的id

        • rank:表示行政地区的级别

          • 0:国家:country
          • 1:省份:province
          • 2:城市:city
          • 3:县/区:county
          • 4:乡镇/区域:town
        • areaname:地区名称

        • 举例

          • 清华园街道:4

    - 海淀区

    - 北京市【市级】

    - 北京市【省级】

- **实现思路**:以乡镇维度为例

  - 获取所有乡镇的信息

    ```sql
    select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 4;
    ```

  - 获取所有县区的信息

    ```sql
    select id county_id,areaname county,parentid from one_make_dwd.ciss_base_areas where rank = 3;
    ```

  - 获取所有省份的信息

    ```sql
    select id city_id,areaname city,parentid from one_make_dwd.ciss_base_areas where rank = 2;
    ```

  - 获取所有省份的信息

    ```sql
    select id province_id,areaname province,parentid from one_make_dwd.ciss_base_areas where rank = 1;
    ```

  - 需求:获取每个镇的所有行政地区信息

    ```
    省份id	省份名称	城市id	城市名称	县区id	县区名称		乡镇id	乡镇名称
    ```

  - 实现:下一级地区的父id = 上一级地区的id

    ```sql
    select
        province_id,province,city_id,city,county_id,county,area_id,area
    from
         ( select id area_id,areaname area,parentid from one_make_dwd.ciss_base_areas where rank = 4 ) town
    join ( select id county_id,areaname county,parentid from one_make_dwd.ciss_base_areas where rank = 3 ) county
        on town.parentid = county.county_id
    join ( select id city_id,areaname city,parentid from one_make_dwd.ciss_base_areas where rank = 2 ) city
        on county.parentid = city.city_id
    join ( select id province_id,areaname province,parentid from one_make_dwd.ciss_base_areas where rank = 1 ) province
        on city.parentid = province.province_id;
    ```
  • 小结

    • 掌握行政地区维度的需求及设计

知识点10:行政地区维度构建

  • 目标实现行政地区维度表的构建

  • 实施

    • 建维度库

      create database if not exists one_make_dws;
      
    • 建维度表

      • 区域粒度【乡镇】

        create external table if not exists one_make_dws.dim_location_areas(
            id string comment 'id'
            , province_id string comment '省份ID'
            , province string comment '省份名称'
            , province_short_name string comment '省份短名称'
            , city_id string comment '城市ID'
            , city string comment '城市'
            , city_short_name string comment '城市短名称'
            , county_id string comment '县城ID'
            , county string comment '县城'
            , county_short_name string comment '县城短名称'
            , area_id string comment '区域ID'
            , area string comment '区域名称'
            , area_short_name string comment '区域短名称'
        ) comment '区域维度区域级别表'
        stored as orc
        tblproperties ("orc.compress"="SNAPPY")
        location '/data/dw/dws/one_make/dim_location_areas';
        
      • 县区粒度

        create external table if not exists one_make_dws.dim_location_county(
            id string comment 'id'
            , province_id string comment '省份ID'
            , province string comment '省份名称'
            , province_short_name string comment '省份短名称'
            , city_id string comment '城市ID'
            , city string comment '城市'
            , city_short_name string comment '城市短名称'
            , county_id string comment '县城ID'
            , county string comment '县城'
            , county_short_name string comment '县城短名称'
        ) comment '区域维度表(县城粒度)'
        stored as orc
        tblproperties ("orc.compress"="SNAPPY")
        location '/data/dw/dws/one_make/dim_location_county';
        
    • 抽取数据

      • 区域粒度

        insert overwrite table one_make_dws.dim_location_areas
        select
            /*+repartition(1) */
            t_area.id as id,
            t_province.id as province_id,
            t_province.areaname as province,
            t_province.shortname as province_short_name,
            t_city.id as city_id,
            t_city.areaname as city,
            t_city.shortname as city_short_name,
            t_county.id as county_id,
            t_county.areaname as county,
            t_county.shortname as county_short_name,
            t_area.id as area_id,
            t_area.areaname as area,
            t_area.shortname area_short_name
        from
            one_make_dwd.ciss_base_areas t_area
            inner join one_make_dwd.ciss_base_areas t_county on t_area.rank = 4 and t_area.parentid = t_county.id
            inner join one_make_dwd.ciss_base_areas t_city on t_county.parentid = t_city.id
            inner join one_make_dwd.ciss_base_areas t_province on t_city.parentid = t_province.id
            inner join one_make_dwd.ciss_base_areas t_nation on t_province.parentid = t_nation.id
        ;
        
      • 县区粒度

        insert overwrite table one_make_dws.dim_location_county
        select
            /*+repartition(1) */
            t_county.id as id,
            t_province.id as province_id,
            t_province.areaname as province,
            t_province.shortname as province_short_name,
            t_city.id as city_id,
            t_city.areaname as city,
            t_city.shortname as city_short_name,
            t_county.id as county_id,
            t_county.areaname as county,
            t_county.shortname as county_short_name
        from
            one_make_dwd.ciss_base_areas t_county
            inner join one_make_dwd.ciss_base_areas t_city on t_county.rank =3 and t_county.parentid = t_city.id
            inner join one_make_dwd.ciss_base_areas t_province on t_city.parentid = t_province.id
            inner join one_make_dwd.ciss_base_areas t_nation on t_province.parentid = t_nation.id
        ;
        
      • SQL语法如何实现分区调整: /*+repartition(1) */

  • 小结

    • 实现行政地区维度表的构建
    • 自行完善城市粒度、省份粒度

知识点11:日期时间维度设计

  • 目标掌握日期时间维度的需求与设计

  • 路径

    • step1:需求
    • step2:设计
  • 实施

    • 需求:构建日期时间维度表,得到所有年、季度、月、周、日的维度信息

      dateIdString日期ID20210101
      yearNameCNString年份名称(中文)2021年
      yearInt年份2021
      yearMonthIdString年月ID202101
      yearNameCNString年月(中文)2021年01月
      quotaIdString季度ID2021Q1
      quotaNameCNString季度名称(中文)第一季度
      quotaNameENString季度名称(英文)2021 Q1
      quotaShortNameENString季度名称(英文简写)Q1
      weekInYearIdString周ID2021W1
      weekInYearNameCNString周(中文)2021第1周
      weekInYearNameENString周(英文)2021 W1
      weekdayInt星期5
      weekdayCNString星期(中文)星期五
      weekdayENString星期(英文)Friday
      weekdayShortNameENString星期(英文缩写)Fri
      yyyyMMddString日期(yyyy-mm-dd)2021-01-01
      yyyyMMddCNString日期中文2021年01月01日
      isWorkdayString是否工作日n
      isWeekendString是否周末n
      isHolidayString是否法定节假日y
      dateTypeString日期类型法定节假日 | 工作日 | 周末
      • 统计不同时间维度下的呼叫次数、工单数、维修数、安装数、报销金额、核销数等
    • 设计

      • 数据来源:提前通过程序生成构建,不是从数据中抽取的

        2021  2021-10	4	42周		星期日		2021-10-10		yes	 no		周末
        
      • 执行周期:每一年生成下一年的每一天的维度信息,增量同步到维度表的分区中

  • 小结

    • 掌握日期时间维度的需求与设计

知识点12:日期时间维度构建

  • 目标实现日期时间维度表的构建

  • 实施

    • 建维度表

      -- 创建日期维度表,日期维度表按照年份分区
      create external table if not exists one_make_dws.dim_date(
          date_id string comment '日期id'
          , year_name_cn string comment '年份名称(中文)'
          , year_month_id string comment '年月id'
          , year_month_cn string comment '年月(中文)'
          , quota_id string comment '季度id'
          , quota_namecn string comment '季度名称(中文)'
          , quota_nameen string comment '季度名称(英文)'
          , quota_shortnameen string comment '季度名称(英文简写)'
          , week_in_year_id string comment '周id'
          , week_in_year_name_cn string comment '周(中文)'
          , week_in_year_name_en string comment '周(英文)'
          , weekday int comment '星期'
          , weekday_cn string comment '星期(中文)'
          , weekday_en string comment '星期(英文)'
          , weekday_short_name_en string comment '星期(英文缩写)'
          , yyyymmdd string comment '日期_yyyy_mm_dd'
          , yyyymmdd_cn string comment '日期中文'
          , is_workday string comment '是否工作日'
          , is_weekend string comment '是否周末'
          , is_holiday string comment '是否法定节假日'
          , date_type string comment '日期类型'
      ) comment '时间维度表'
      partitioned by (year integer)
      stored as orc
      location '/data/dw/dws/one_make/dim_date'
      ;
      
    • 加载数据

      • HDFS创建路径

        hdfs dfs -mkdir -p /data/dw/dws/one_make/dim_date/2021
        
        • 可以使用rz方式

        yum install -y lrzsz
        进入Hadoop容器
        rz
        hdfs dfs -put part-00000-cf2fc4b3-7485-4861-81e7-da0c3f76e6de-c000.snappy.orc /data/dw/dws/one_make/dim_date/2021/

        
        
        
        
    • 上传本地文件

      • node1上操作

        mkdir -p /mnt/docker_share/data/DIM_DATE/2021
        cd /mnt/docker_share/data/DIM_DATE/2021/
        rz
        
        • Hadoop镜像

        docker exec -it hadoop bash

        
        ```shell
        hdfs dfs -put /mnt/docker_share/data/DIM_DATE/2021 /data/dw/dws/one_make/dim_date/
        
    • 申明分区

      alter table one_make_dws.dim_date add if not exists partition (year='2021') location '/data/dw/dws/one_make/dim_date/2021';
      
      • 查看数据

      select * from one_make_dws.dim_date;

      
      
      
      
  • 小结

    • 实现日期时间维度表的构建

知识点13:服务网点维度设计

  • 目标:掌握服务网点维度的需求与设计

  • 路径

    • step1:需求
    • step2:设计
  • 实施

    • 需求:构建服务网点维度表,得到服务网点id、网点名称、网点所属的地理区域、服务网点状态等

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5AHJXiRF-1671679742385)(Day1010_数仓维度层DWS层构建.assets/image-20211003085815855.png)]

      • 统计不同服务网点的服务人员数、工单数、核销数等
    • 设计

      • 数据来源

        • ciss_base_servicestation:服务网点信息表

          select
              id,name,code,province,city,region,status,org_id,org_name
          from ciss_base_servicestation;
          
        • eos_dict_type:字典状态类别表,记录所有需要使用字典标记的表

          --字典类别表:字典类型id和字典类型名称
          select dicttypeid,dicttypename from eos_dict_type where dicttypename = '服务网点使用状态';
          
        
        
        
      • eos_dict_entry:字典状态明细表,记录所有具体的状态或者类别信息

        --字典明细表:字典类型id、具体的编号和值
        

      select dicttypeid,dictid,dictname from eos_dict_entry where dicttypeid = ‘BUSS_SERVICE_STATION_STATUS’;

      
        
      
      - ciss_base_areas:行政地区信息表
      
        - 通过具体的id关联所有地区信息
      
          
      
      - **实现设计**
      
      ```sql
      select
          id,name,code,
        province provinceid,city cityid,region regionid,
          pro.provincename,tcity.cityname,tregion.regionname,
          status,
          b.dictname
          org_id,org_name
      from one_make_dwd.ciss_base_servicestation a
      join (select
              b.dictid,b.dictname
              from one_make_dwd.eos_dict_type a join one_make_dwd.eos_dict_entry b on a.dicttypeid = b.dicttypeid
              where a.dicttypename = '服务网点使用状态'
            ) b on a.status = b.dictid
      join
      (select id as provinceid,areaname as provincename from one_make_dwd.ciss_base_areas where rank = 1) pro on pro.provinceid = a.province
      join
      (select id as cityid,areaname as cityname from one_make_dwd.ciss_base_areas where rank = 2) tcity on tcity.cityid = a.city
      join
      (select id as regionid,areaname as regionname from one_make_dwd.ciss_base_areas where rank = 3 ) tregion on tregion.regionid = a.region;
      
  • 小结

    • 掌握服务网点维度的需求与设计

知识点14:服务网点维度构建

  • 目标实现服务网点维度的构建

  • 实施

    • 建维度表

      -- 服务网点维度表
      create external table if not exists one_make_dws.dim_srv_station(
          id string comment '服务网点id'
          , name string comment '服务网点名称'
          ,code string comment '网点编号'
          ,province_id string comment '省份id'
          ,province string comment '省份名称'
          ,city_id string comment '城市id'
          ,city string comment '城市'
          ,county_id string comment '县城id'
          ,county string comment '县城'
          ,status string comment '服务网点状态'
          ,status_name string comment '状态中文名'
          ,org_id string comment '所属组织机构id'
          ,org_name string comment '所属组件机构名称'
      )comment '服务网点维度表'
      partitioned by (dt string)
      stored as orc
      location '/data/dw/dws/one_make/dim_srv_station';
      
    • 加载数据

      insert overwrite table one_make_dws.dim_srv_station partition(dt='20210101')
      select
          station.id
          , station.name
          , station.code
          , province.id as province_id
          , province.areaname as province
          , city.id as city_id
          , city.areaname as city
          , county.id as county_id
          , county.areaname as county
          , station.status as status
          , dict_e.dictname as status_name
          , station.org_id as org_id
          , station.org_name as org_name
      from one_make_dwd.ciss_base_servicestation station
      -- 关联省份RANK为1
      left join one_make_dwd.ciss_base_areas province on station.dt = '20210101' and station.province = province.id and province.rank = 1   
      -- 关联城市RANK为2
      left join one_make_dwd.ciss_base_areas city on station.city = city.id and city.rank = 2 
      -- 关联城市RANK为3
      left join one_make_dwd.ciss_base_areas county on station.region = county.id and county.rank = 3
      -- 关联字典父表(dict_t)
      cross join one_make_dwd.eos_dict_type dict_t  on dict_t.dt = '20210101' and dict_t.dicttypename = '服务网点使用状态'
      -- 关联字典子表(dict_e)
      left join one_make_dwd.eos_dict_entry dict_e on dict_e.dt = '20210101' and dict_t.dicttypeid = dict_e.dicttypeid and station.status = dict_e.dictid;
      
      • cross join:笛卡尔积,join时候不给关联条件

        • select * from A,B
        • select * from A join B
        • cross join
      • 查看结果

  • 小结

    • 实现服务网点维度的构建

知识点15:油站维度设计

  • 目标:掌握油站维度的需求与设计

  • 路径

    • step1:需求
    • step2:设计
  • 实施

    • 需求:构建油站维度表,得到油站id、油站名称、油站所属的地理区域、所属公司、油站状态等

  • 设计

    • 数据来源

      • ciss_base_oilstation:油站信息表

        select
            id, name, code,
            customer_id, customer_name,
            province, city, region, township,
            status, customer_classify, dt
        from one_make_dwd.ciss_base_oilstation
        where id != '' and name is not null and name != 'null' and customer_id is not null;
        
      • eos_dict_type:字典状态类别表,记录所有需要使用字典标记的表

        select * from eos_dict_type where dicttypename = '油站状态';
        
      • eos_dict_entry:字典状态明细表,记录所有具体的状态或者类别信息

        select * from eos_dict_entry where dicttypeid = 'BUSS_OILSTATION_STATUS';
        
      • ciss_base_baseinfo:客户公司信息表【公司ID、公司名称】

        select ygcode, companyname from one_make_dwd.ciss_base_baseinfo group by ygcode, companyname;
        
        • 数据有重复,做个去重
      • ciss_base_customer:客户信息表【客户id、客户省份名称、所属公司ID】

        select code, province, company from one_make_dwd.ciss_base_customer;
        
      • ciss_base_areas:行政地区信息表

        • 通过具体的id关联所有地区信息
    • 实现设计

      • 所有表按照对应字段关联,获取对应的属性字段
  • 小结

    • 掌握油站维度的需求与设计

知识点16:油站维度构建

  • 目标实现油站维度的构建

  • 实施

    • 建维度表

      -- 创建油站维度表
      create external table if not exists one_make_dws.dim_oilstation(
          id string comment '油站ID'
          , name string comment '油站名称'
          , code string comment '油站编码'
          , customer_id string comment '客户ID'
          , customer_name string comment '客户名称'
          , province_id int comment '省份id'
          , province_name string comment '省份名称'
          , city_id int comment '城市id'
          , city_name string comment '城市名称'
          , county_id int comment '县城ID'
          , county_name string comment '县城名称'
          , area_id int comment '区域id'
          , area_name string comment '区域名称'
          , customer_classify_id string comment '客户分类ID'
          , customer_classify_name string comment '客户分类名称'
          , status int comment '油站状态(1、2)'
          , status_name string comment '油站状态名(正常、停用)'
          , company_id int comment '所属公司ID'
          , company_name string comment '所属公司名称'
          , customer_province_id int comment '客户所属省份ID'
          , customer_province_name string comment '客户所属省份'
      ) COMMENT '油站维度表'
      PARTITIONED BY (dt STRING)
      STORED AS TEXTFILE
      LOCATION '/data/dw/dws/one_make/dim_oilstation';
      
    • 抽取数据

      insert overwrite table one_make_dws.dim_oilstation 

      以上是关于Python工业项目实战 04:数仓维度层DWS层构建的主要内容,如果未能解决你的问题,请参考以下文章

      Python工业项目实战 06:数仓主题应用层ST层构建

      Python工业项目实战03:ODS层及DWD层构建

      离线数仓

      数仓建模分层理论

      数仓搭建DWS层

      最强最全面的数仓建设规范指南