博客
关于我
项目实战从0到1之hive(24)企业级数据仓库构建(六):数仓理论及数仓搭建
阅读量:594 次
发布时间:2019-03-11

本文共 5342 字,大约阅读时间需要 17 分钟。

数仓分层与理论基础

为何需要数据分层?

在数据仓库的建设过程中,数据分层是最基本也是最关键的一步。数据分层的核心目标是根据数据的使用场景和特点,将复杂的数据按照一定的粒度进行分类管理。这不仅可以提高数据的利用效率,还能有效降低数据处理的难度和成本。

数据集市与数据仓库的概念

在数据处理领域,数据集市与数据仓库是两个密切相关但又有本质区别的概念。数据集市主要面向数据的交易和集成,强调数据的标准化和一致性,而数据仓库则侧重于对企业内部数据的沉淀和分析,主要服务于企业的决策支持。理解这两者的区别,对于数据仓库的设计与实施至关重要。

数据仓库命名规范

在数据仓库中,命名规范是保证数据组织和管理有序的重要基础。规范的命名不仅能提高数据的可读性,还能减少命名冲突,降低维护成本。

表命名

  • ODS层:ods_表名
  • DWD层:dwd_dim/fact_表名
  • DWS层:dws_表名
  • DWT层:dwt_购物车
  • ADS层:ads_表名
  • 临时表:xxx_tmp
  • 用户行为表:以log为后缀

脚本命名

  • 数据源到目标:数据源_to_目标_db/log.sh
  • 用户行为脚本:以log为后缀
  • 业务数据脚本:以db为后缀

数仓理论基础

范式理论

范式理论是数据库设计的基础,主要涉及关系型数据库的规范化。

范式概念

  • 定义:范式可以理解为设计一张数据表的表结构,符合的标准级别,即表的规范和要求。

  • 优点:关系型数据库设计时,遵照一定的规范要求,目的在于降低数据的冗余性。

    • 为什么要降低数据冗余性?
    • (1)十几年前,磁盘很贵,为了减少磁盘存储。
    • (2)以前没有分布式系统,都是单机,只能增加磁盘,磁盘个数也是有限的。
    • (3)一次修改,需要修改多个表,很难保证数据一致性。
  • 缺点:范式的缺点是获取数据时,需要通过 Join 拼接出最后的数据。

  • 分类:目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。

  • 函数依赖

    函数依赖是数据库设计中重要的概念,描述了数据库中的主键和外键之间的关系。

    三范式区分

    在实际应用中,主要使用第三范式(3NF),因为它在保证数据一致性的同时,数据冗余较低,便于操作。

    关系建模与维度建模

    在数据处理中,主要有两种类型:联机事务处理(OLTP)和联机分析处理(OLAP)。

    OLTP vs OLAP

    • OLTP:主要用于日常的事务处理,如银行交易。
    • OLAP:主要用于数据分析,如市场报告。

    两者的主要区别在于数据建模方式:

    • 关系建模:遵循3NF,表结构松散,数据分布多,适合OLTP。
    • 维度建模:以事实表为中心,采用星型或雪花模型,适合OLAP。

    在维度建模中,常见的模型有星型模型、雪花模型和星座模型。

    维度表与事实表

    在维度建模中,维度表和事实表是两个核心概念。

    维度表

    • 定义:维度表描述事实表中的某一维度信息,如用户、日期、地区等。
    • 特征
      • 范围宽(包含多个属性)。
      • 行数相对较少(一般<10万条)。
      • 内容固定(如编码表)。

    事实表

    • 定义:事实表记录业务事件的度量值,如订单金额、下单次数等。
    • 特征
      • 数据量大(每天新增数据多)。
      • 内容窄(列数相对较少)。

    事实表类型

  • 事务型事实表:记录每个事务或事件,如销售订单。
  • 周期型快照事实表:记录固定时间间隔的数据,如每日销售额。
  • 累积型快照事实表:记录业务流程的阶段数据,如订单状态变化。
  • 数据仓库建模

    在数据仓库中,ODS、DWD、DWS、DWT和ADS层的建模至关重要。

    ODS层

    ODS层的作用是对原始数据进行备份和压缩处理,具体包括:

    • 压缩:采用LZO压缩技术,减少存储空间。
    • 分区表:防止全表扫描。
    • 外部表:创建外部表以便与其他系统交互。

    DWD层

    DWD层是数据仓库的核心建模层,采用星型模型,主要包含维度和事实表。建模步骤包括:

  • 选择业务过程:如下单、支付等。
  • 声明粒度:确定数据的细化程度。
  • 确定维度:描述“谁、哪里、何时”。
  • 确定事实:定义度量值,如订单金额。
  • DWS层

    DWS层用于统计主题对象的当日行为,服务于DWT层和特殊需求。

    DWT层

    DWT层以主题对象为中心,构建全量宽表,满足分析需求。

    ADS层

    ADS层对电商系统的各主题指标进行分析,支持决策优化。

    ODS层搭建实例

    1. 创建数据库

    show databases;create database gmall;use gmall;

    2. ODS层(用户行为数据)

    # 创建启动日志表drop table if exists ods_start_log;create external table ods_start_log(  `line` string)PARTITIONED BY (`dt` string)STORED AS   INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'LOCATION '/warehouse/gmall/ods/ods_start_log';# 加载数据load data inpath '/origin_data/gmall/log/topic_start/2020-03-10' into table gmall.ods_start_log partition(dt='2020-03-10');# 查看是否加载成功select * from ods_start_log where dt='2020-03-10' limit 2;# 创建事件日志表drop table if exists ods_event_log;create external table ods_event_log(  `line` string)PARTITIONED BY (`dt` string)STORED AS   INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'LOCATION '/warehouse/gmall/ods/ods_event_log';# 加载事件数据load data inpath '/origin_data/gmall/log/topic_event/2020-03-10' into table gmall.ods_event_log partition(dt='2020-03-10');# 查看是否加载成功select * from ods_event_log where dt='2020-03-10' limit 2;

    3. 脚本优化

    #!/bin/bashAPP=gmallHIVE=/opt/modules/hive/bin/hiveif [ -n "$1" ]; then  do_date=$1else  do_date=`date -d "-1 day" +%F`fisql="load data inpath '/origin_data/$APP/db/topic_start/$do_date' overwrite into table ${APP}.ods_start_log partition(dt='$do_date');load data inpath '/origin_data/$APP/db/topic_event/$do_date' overwrite into table ${APP}.ods_event_log partition(dt='$do_date');"hive -e "$sql"hadoop jar /opt/modules/hadoop/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_start_log/dt=$do_datehadoop jar /opt/modules/hadoop/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_event_log/dt=$do_date

    4. 脚本执行

    chmod 777 hdfs_to_ods_log.shhdfs_to_ods_log.sh 2020-03-11

    5. 数据验证

    select * from ods_start_log where dt='2020-03-11' limit 2;select * from ods_event_log where dt='2020-03-11' limit 2;

    每日数据处理时间建议:凌晨30分至1点。

    6. 业务数据加载

    # 订单表drop table if exists ods_order_info;create external table ods_order_info(  `id` string COMMENT '订单号',  `final_total_amount` decimal(10,2) COMMENT '订单金额',  `order_status` string COMMENT '订单状态',  `user_id` string COMMENT '用户 id',  `out_trade_no` string COMMENT '支付流水号',  `create_time` string COMMENT '创建时间',  `operate_time` string COMMENT '操作时间',  `province_id` string COMMENT '省份 ID',  `benefit_reduce_amount` decimal(10,2) COMMENT '优惠金额',  `original_total_amount` decimal(10,2) COMMENT '原价金额',  `feight_fee` decimal(10,2) COMMENT '运费')PARTITIONED BY (`dt` string)ROW FORMAT delimited fields terminated by '\t'STORED AS   INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'LOCATION '/warehouse/gmall/ods/ods_order_info/';# 财单详情表drop table if exists ods_order_detail;create external table ods_order_detail(  `id` string COMMENT '订单编号',  `order_id` string COMMENT '订单号',  `user_id` string COMMENT '用户 id',  `sku_id` string COMMENT '商品 id',  `sku_name` string COMMENT '商品名称',  `order_price` decimal(10,2) COMMENT '商品价格',  `sku_num` bigint COMMENT '商品数量',  `create_time` string COMMENT '创建时间')PARTITIONED BY (`dt` string)ROW FORMAT delimited fields terminated by '\t'STORED AS   INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'LOCATION '/warehouse/gmall/ods/ods_order_detail/';

    以上为数仓搭建ODS层的详细步骤和脚本示例,后续将继续介绍DWD、DWS、DWT等层面的数据清洗与搭建。

    转载地址:http://ueivz.baihongyu.com/

    你可能感兴趣的文章
    object detection错误之no module named nets
    查看>>
    Object of type 'ndarray' is not JSON serializable
    查看>>
    Object Oriented Programming in JavaScript
    查看>>
    object references an unsaved transient instance - save the transient instance before flushing
    查看>>
    Object.keys()的详解和用法
    查看>>
    OBJECTIVE C (XCODE) 绘图功能简介(转载)
    查看>>
    Objective-C ---JSON 解析 和 KVC
    查看>>
    Objective-C 编码规范
    查看>>
    Objective-C——判断对象等同性
    查看>>
    Objective-C之成魔之路【7-类、对象和方法】
    查看>>
    Objective-C享元模式(Flyweight)
    查看>>
    Objective-C以递归的方式实现二叉搜索树算法(附完整源码)
    查看>>
    Objective-C内存管理教程和原理剖析(三)
    查看>>
    Objective-C实现 Greedy Best First Search最佳优先搜索算法(附完整源码)
    查看>>
    Objective-C实现 jugglerSequence杂耍者序列算法 (附完整源码)
    查看>>
    Objective-C实现1000 位斐波那契数算法(附完整源码)
    查看>>
    Objective-C实现2 个数字之间的算术几何平均值算法(附完整源码)
    查看>>
    Objective-C实现2d 表面渲染 3d 点算法(附完整源码)
    查看>>
    Objective-C实现2D变换算法(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>