DWB-数据基础层,功能是把数据降维成跟主题相关的宽表
- 在进行维度退化的时候,需要将各个表的==核心字段==退化到事实表中形成宽表,明显不需要的可以不退化 另外拿捏不住 “==宁滥勿缺==”。
- 退化维度(Degenerate Dimension,DD),就是那些看起来像是事实表的一个维度关键字,但实际上并没有对应的维度表。退化维度技术可以减少维度的数量(降维操作)
以下以店铺明细表为例子:
我们在创建宽表的时候,可能会遇到地址,和区域分块的情况,需要区域表三级联动 然后加上具体地址才能获得完整的店铺地址
建表分析:店铺明细宽表
image.png店铺明细宽表主要有
- 店铺表dim_store(核心表)(绝大部分字段)
- 商圈表dim_trade_area 记录商圈相关信息,店铺需要归属商圈中(ID主键是店铺表中的外键)
其中 店铺的地址信息 主要有两张表负责 省市县 具体地址 - 地址信息表dim_location
记录了type 地址类型( 1:商圈地址;2:店铺地址;3.用户地址管理;)
code 县的code 与 行政区域表的code 相关联
address 具体的地址 - 行政区域表 dim_district (id code name pid ) 区域id 区域父id 区域主要有省市县 省的pid 没有
分析
地质类信息如何设计存储.png只需要 dim_location join dim_district on adcode = code 把俩表关联起来
然后把区域表自连接 逻辑上化成三个表 县的pid = 市id, 市的pid = 省的id
然后查出县的name,市的name 省的name
代码实现
-- 创建宽表
CREATE TABLE yp_dwb.dwb_shop_detail(
-- 店铺dim_store
id string,
address_info string COMMENT '店铺详细地址',
store_name string COMMENT '店铺名称',
is_pay_bond tinyint COMMENT '是否有交过保证金 1:是0:否',
trade_area_id string COMMENT '归属商圈ID',
delivery_method tinyint COMMENT '配送方式 1 :自提 ;3 :自提加配送均可\; 2 : 商家配送',
store_type int COMMENT '店铺类型 22天街网店 23实体店 24直营店铺 33会员专区店',
is_primary tinyint COMMENT '是否是总店 1: 是 2: 不是',
parent_store_id string COMMENT '父级店铺的id,只有当is_primary类型为2时有效',
-- 商圈
trade_area_name string COMMENT '商圈名称',
-- 区域-店铺
province_id string COMMENT '店铺所在省份ID',
city_id string COMMENT '店铺所在城市ID',
area_id string COMMENT '店铺所在县ID',
province_name string COMMENT '省份名称',
city_name string COMMENT '城市名称',
area_name string COMMENT '县名称'
)
COMMENT '店铺明细表'
row format delimited fields terminated by '\t'
stored as orc
tblproperties ('orc.compress' = 'SNAPPY');
-- 插入
insert into yp_dwb.dwb_shop_detail
select
ds.id,
address_info,
ds.name store_name,
is_pay_bond,
trade_area_id,
delivery_method,
store_type,
is_primary,
parent_store_id,
--商圈
ta.name trade_area_name,
province_id,
city_id,
area_id,
-- 区域字典
province.name province_name,
city.name city_name,
county.name area_name
from yp_dwd.dim_store ds left join yp_dwd.dim_trade_area ta
on ds.trade_area_id = ta.id and ds.end_date = "9999-99-99"
left join yp_dwd.dim_location loca
on ds.id =loca.correlation_id and loca.type=2 and loca.end_date = "9999-99-99"
left join yp_dwd.dim_district county on loca.adcode = county.code
left join yp_dwd.dim_district city on county.pid = city.code
left join yp_dwd.dim_district province on city.pid = province.code;
网友评论