数仓搭建(hive):DWB层(基础数据层)

news/2025/2/21 7:12:02

维度退化:  通过减少表的数量和提高数据的冗余来优化查询性能。

在维度退化中,相关的维度数据被合并到一个宽表中,减少了查询时需要进行的表连接操作。例如,在销售数据仓库中,客户信息、产品信息和时间信息等维度可能会被合并到一个单一的销售事实表中。这样,查询时只需访问一个表,而不必连接多个表,从而提高了查询效率。

做宽表的原因:

把多张表内容合并到一张表>>提升查询速度

弊端: 占更多的内存

数仓的本质>>用空间换时间

做主题宽表

1.业务人员告知需要的字段>>直接create table

2.业务人员没有告知

先确定需要用来做宽表的表>>事实表/与主题相关>>确认主表副表(left join)>>重复字段只保留主表的字段

很少选择第二种>>因为不能写注释; 只能建普通表,不能建分区表/分桶表

示例

步骤: 

1.建DWB数据库

create database dwb;

2.建相应的主题宽表:(比如创建订单明细宽表)

先从事实表里面确认所需要的表(参照数据字典表了解表的实际内容)

t_goods_evaluation 订单评价表(主题相关)

t_goods_evaluation_detail 商品评价表(无关主题)

数据字典表(中英对照)

把订单主表(t_shop_order)确定为表连接的主表,其余为副表

主表的确定

业务需求分析

  • 核心业务实体:明确业务需求,找出核心业务实体,如订单、客户、产品等。

  • 高频查询:分析高频查询,确定哪些表最常被访问。

 数据关系分析

  • 主外键关系:通过主外键关系确定主表,通常主表包含核心业务数据,其他表通过外键关联。

  • 数据粒度:选择粒度最细的表作为主表,确保宽表包含最详细的信息。

 数据量分析

  • 数据量大小:选择数据量较大的表作为主表,避免宽表数据量过大。

  • 更新频率:选择更新频率较低的表作为主表,减少宽表维护成本。

工具支持

  • 数据建模工具:使用数据建模工具分析表关系,辅助确定主表。

  • ETL工具:利用ETL工具自动化宽表构建,减少手动操作。

表字段的确定

主表字段全部保留

订单主表(t_shop_order)

副表字段

fact_shop_order_group (订单组表)

id是自增列,用来确保数据的唯一性(不保留)

order_id 用来和主表关联的字段,主表已存在(不保留)
其他字段,和主表重复(不保留)

t_shop_order_address_detail(订单副表)

id是和主表的关联字段(不保留)

其余字段,和主表重复(不保留)

t_order_pay(订单支付表)

 t_refund_order (退款订单表)

t_order_settle(订单结算表)

t_shop_order_goods_details(订单商品快照表)

id自增列主键(不保留)

order_id 主表关联字段, 主表已经存在(不保留)

shop_store_id  店铺id, buyer_id   买家id 在主表中已存在(不保留)

其他字段, 主表中已经存在(不保留)

t_goods_evaluation(订单评价表)

 user_id 评论人id=主表的buyer_id  买家id; 主表已经存在(不保留)

t_order_delievery_item(配送信息表 )

id 自增列(不保留)

shop_order_id 订单id, 和主表关联的字段, 主表已经存在(不保留)

refund_order_id 在副表t_shop_order_goods_details(订单商品快照表)已经存在(不保留)

shop_store_id 店铺id, buyer_id  买家id  在主表已经存在(不保留)

circle_master_user_id 在副表t_order_settle(订单结算表)已经存在(不保留)

dispatcher_user_id 在副表t_order_settle(订单结算表)已经存在(不保留)

sql

create table dwb.dwb_order_detail
as 
select
    o.id
    ,o.order_num
    ,o.buyer_id
    ,o.store_id
    ,o.order_from
    ,o.order_state
    ,o.create_date
    ,o.finnshed_time
    ,o.is_settlement
    ,o.is_delete
    ,o.evaluation_state
    ,o.way
    ,o.is_stock_up
    ,o.create_user
    ,o.create_time
    ,o.update_user
    ,o.update_time
    ,o.is_valid
    ,og.group_id
    ,og.is_pay
    ,od.order_amount
    ,od.discount_amount
    ,od.goods_amount
    ,od.is_delivery
    ,od.buyer_notes
    ,od.pay_time
    ,od.receive_time
    ,od.delivery_begin_time
    ,od.arrive_store_time
    ,od.arrive_time
    ,op.order_pay_amount
    ,ro.apply_date
    ,ro.modify_date
    ,ro.refund_reason
    ,ro.refund_amount
    ,ro.refund_state
    ,ro.refuse_refund_reason
    ,ro.refund_goods_type
    ,ro.refund_shipping_fee
    ,os.settlement_create_date
    ,os.settlement_amount
    ,os.dispatcher_user_id
    ,os.dispatcher_money
    ,os.circle_master_user_id
    ,os.circle_master_money
    ,os.plat_fee
    ,os.store_money
    ,os.status
    ,os.note
    ,os.settle_time
    ,os.first_commission_user_id
    ,os.first_commission_money
    ,os.second_commission_user_id
    ,os.second_commission_money
    ,ogd.goods_id
    ,ogd.buy_num
    ,ogd.goods_price
    ,ogd.total_price
    ,ogd.goods_name
    ,ogd.goods_image
    ,ogd.goods_specification
    ,ogd.goods_weight
    ,ogd.goods_unit
    ,ogd.goods_type
    ,ogd.refund_order_id
    ,ogd.goods_brokerage
    ,ogd.is_refund
    ,e.geval_scores
    ,e.geval_scores_speed
    ,e.geval_scores_service
    ,e.geval_isanony
    ,odi.dispatcher_order_type
    ,odi.dispatcher_order_state
    ,odi.order_goods_num
    ,odi.delivery_fee
    ,odi.distance
    ,odi.dispatcher_code
    ,odi.receiver_name
    ,odi.receiver_phone
    ,odi.sender_name
    ,odi.sender_phone
from dwd.fact_shop_order o
left join dwd.fact_shop_order_group og
    on o.id = og.order_id
left join dwd.fact_shop_order_address_detail od
    on o.id = od.id
left join dwd.fact_order_pay op
    on og.group_id = op.group_id
left join dwd.fact_refund_order ro
    on o.id = ro.order_id
left join dwd.fact_order_settle os
    on os.order_id = o.id
left join  dwd.fact_shop_order_goods_details ogd
    on ogd.order_id = o.id
left join dwd.fact_goods_evaluation e
    on e.order_id = o.id
left join  dwd.fact_order_delievery_item odi
    on odi.shop_order_id = o.id;

宽表查询

select * from  dwb.dwb_order_detail; 


http://www.niftyadmin.cn/n/5860431.html

相关文章

分布式文本多语言翻译存储平台

分布式文本多语言翻译存储平台 地址: Gitee:https://gitee.com/dreamPointer/zza-translation/blob/master/README.md 一、提供服务 分布式文本翻译服务,长文本翻译支持流式回调(todo)分布式文本多语言翻译结果存储服…

Elasticsearch 自动补全搜索 - autocomplete

作者:来自 Elastic Amit Khandelwal 探索处理自动完成的不同方法,从基础到高级,包括输入时搜索、查询时间、完成建议器和索引时间。 在本文中,我们将介绍如何避免严重的性能错误、Elasticsearch 默认解决方案为何不适用以及重要的…

uniapp多端适配

UniApp是一个基于Vue.js开发多端应用的框架,它可以让开发者编写一次代码,同时适配iOS、Android、Web等多个平台。 环境搭建: UniApp基于Vue.js开发,所以需要先安装Vue CLI npm install -g vue/cli 创建一个新的UniApp项目&…

MapReduce 第二部:深入分析与实践

在第一部分中,我们了解了MapReduce的基本概念和如何使用Python2编写MapReduce程序进行简单的单词计数。今天,我们将深入探讨如何使用MapReduce处理更复杂的数据源,比如HDFS中的CSV文件,并将结果输出到HDFS。通过更复杂的实践案例&…

zero自动化框架搭建---Git安装详解

一、Git下载 下载安装包 官网下载 下载的地址就是官网即可:Git - Downloads 进来直接选择windows的安装包下载 选择安装位置 双击安装包安装,选择安装地址后点击next 选择安装的组件,默认即可 也可按照需要自行选择 Windows Explorer i…

MySQL 三层 B+ 树能存多少数据?

1. B树的基本结构 节点大小:在InnoDB中,B树的每个节点(页)大小通常是16KB。索引项大小:每个索引项的大小取决于主键和指针的大小。假设主键为8字节,指针为6字节,则每个索引项的大小约为14字节。…

leetcode_位运算 190.颠倒二进制位

190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位。 1. 字符串 class Solution:# param n, an integer# return an integerdef reverseBits(self, n):res "" # 创建一个保存结果的空字符串for b in str(bin(n))[2:]:# 遍历n的二进制数res b res # 把每…

线程与线程:从入门到放弃

引言 在计算机科学中,**线程**是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以拥有多个线程,这些线程共享进程的内存空间和资源,但每个线程拥有独立的执行栈和程序计数器。 本…