本文共 5342 字,大约阅读时间需要 17 分钟。
在数据仓库的建设过程中,数据分层是最基本也是最关键的一步。数据分层的核心目标是根据数据的使用场景和特点,将复杂的数据按照一定的粒度进行分类管理。这不仅可以提高数据的利用效率,还能有效降低数据处理的难度和成本。
在数据处理领域,数据集市与数据仓库是两个密切相关但又有本质区别的概念。数据集市主要面向数据的交易和集成,强调数据的标准化和一致性,而数据仓库则侧重于对企业内部数据的沉淀和分析,主要服务于企业的决策支持。理解这两者的区别,对于数据仓库的设计与实施至关重要。
在数据仓库中,命名规范是保证数据组织和管理有序的重要基础。规范的命名不仅能提高数据的可读性,还能减少命名冲突,降低维护成本。
范式理论是数据库设计的基础,主要涉及关系型数据库的规范化。
定义:范式可以理解为设计一张数据表的表结构,符合的标准级别,即表的规范和要求。
优点:关系型数据库设计时,遵照一定的规范要求,目的在于降低数据的冗余性。
缺点:范式的缺点是获取数据时,需要通过 Join 拼接出最后的数据。
分类:目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。
函数依赖是数据库设计中重要的概念,描述了数据库中的主键和外键之间的关系。
在实际应用中,主要使用第三范式(3NF),因为它在保证数据一致性的同时,数据冗余较低,便于操作。
在数据处理中,主要有两种类型:联机事务处理(OLTP)和联机分析处理(OLAP)。
两者的主要区别在于数据建模方式:
在维度建模中,常见的模型有星型模型、雪花模型和星座模型。
在维度建模中,维度表和事实表是两个核心概念。
在数据仓库中,ODS、DWD、DWS、DWT和ADS层的建模至关重要。
ODS层的作用是对原始数据进行备份和压缩处理,具体包括:
DWD层是数据仓库的核心建模层,采用星型模型,主要包含维度和事实表。建模步骤包括:
DWS层用于统计主题对象的当日行为,服务于DWT层和特殊需求。
DWT层以主题对象为中心,构建全量宽表,满足分析需求。
ADS层对电商系统的各主题指标进行分析,支持决策优化。
show databases;create database gmall;use gmall;
# 创建启动日志表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;
#!/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 chmod 777 hdfs_to_ods_log.shhdfs_to_ods_log.sh 2020-03-11
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点。
# 订单表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/