大数据开发-离线数据仓库(持续继续完善中......)
一:概念
数据仓库是什么?
数据仓库是一个为数据分析而设计的企业级数据管理系统。
维度模型:
所谓维度就是分析数据的角度,维度模型将复杂的业务通过事实和维度两个概念进行呈现。事实通常对应业务工程,维度通常对应业务过程发生所处的环境。
二:整体架构


三:分层结构
1.1:ODS
1.2:DWD
1.3:DWS
1.4:ADS
1.5:DIM:维度层

分析问题的角度
1.6:其他
使用任务调度器,调度各层的 SQL文
四:数仓构建
1.运行环境

1. Hive on Spark :
Hive的执行引擎为Spark

2. 在Hive所在节点部署Spark纯净版
3. Yarn环境配置
2.开发环境
数仓开发工具:DataGrip,使用JDBC协议连接到Hive,需要启动HiveServer2
3.ODS层构建
存储从mysql业务数据库和日志服务器的日志文件采集到的数据
命名:表从名称上区分每一层。分层标记(ods_)+同步数据的表名称+全量/增量标识(full/inc)
4.DIM层构建
1.维度表
(1)确定维度表:
在设计事实表时,已经确定了与每个事实表相关的维度,理论上每个相关维度均需对应一张维度表。需要注意到,可能存在多个事实表与同一个维度都相关的情况,这种情况需保证维度的唯一性,即只创建一张维度表。另外,如果某些维度表的维度属性很少,例如只有一个**名称,则可不创建该维度表,而把该表的维度属性直接增加到与之相关的事实表中,这个操作称为维度退化。
(2)确定主维表和相关维表:
此处的主维表和相关维表均指业务系统中与某维度相关的表。例如业务系统中与商品相关的表有sku_info,spu_info,base_trademark,base_category3,base_category2,base_category1等,其中sku_info就称为商品维度的主维表,其余表称为商品维度的相关维表。维度表的粒度通常与主维表相同。
(3)确定维度属性:
确定维度属性即确定维度表字段。维度属性主要来自于业务系统中与该维度对应的主维表和相关维表。维度属性可直接从主维表或相关维表中选择,也可通过进一步加工得到。
维度表是维度建模的基础和灵魂,事实表围绕业务过程(业务行为)进行设计,维度表围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段,维度字段成为维度属性。
(4)维度变化:
维度属性通常不是静态的,而是会随时间变化的,数据仓库的一个重要特点就是反映历史的变化,所以如何保存维度的历史状态是维度设计的重要工作之一。保存维度数据的历史状态,通常有以下两种做法,分别是全量快照表和拉链表。
拉链表:拉链表的意义就在于能够更加高效的保存维度信息的历史状态。
(5)多维属性:
维表中的某个属性同时有多个值,称之为“多值属性”,例如商品维度的平台属性和销售属性,每个商品均有多个属性值。
针对这种情况,通常有可以采用以下两种方案。
第一种:将多值属性放到一个字段,该字段内容为key1:value1,key2:value2的形式,例如一个手机商品的平台属性值为“品牌:华为,系统:鸿蒙,CPU:麒麟990”。
第二种:将多值属性放到多个字段,每个字段对应一个属性。这种方案只适用于多值属性个数固定的情况。
2.设计要点:
规范化是指使用一系列范式设计数据库的过程,其目的是减少数据冗余,增强数据的一致性。通常情况下,规范化之后,一张表的字段会拆分到多张表。
反规范化是指将多张表的数据冗余到一张表,其目的是减少join操作,提高查询性能。
在设计维度表时,如果对其进行规范化,得到的维度模型称为雪花模型,如果对其进行反规范化,得到的模型称为星型模型。
3.设计步骤:



绝大多数的维度表是全量
3.商品维度表:
字段分析:


建表语句:
其中:ORC表示列式存储,snappy表示压缩方式为snappy(压缩比高)
DROP TABLE IF EXISTS dim_sku_full;
CREATE EXTERNAL TABLE dim_sku_full
(
`id` STRING COMMENT 'SKU_ID',
`price` DECIMAL(16, 2) COMMENT '商品价格',
`sku_name` STRING COMMENT '商品名称',
`sku_desc` STRING COMMENT '商品描述',
`weight` DECIMAL(16, 2) COMMENT '重量',
`is_sale` BOOLEAN COMMENT '是否在售',
`spu_id` STRING COMMENT 'SPU编号',
`spu_name` STRING COMMENT 'SPU名称',
`category3_id` STRING COMMENT '三级品类ID',
`category3_name` STRING COMMENT '三级品类名称',
`category2_id` STRING COMMENT '二级品类id',
`category2_name` STRING COMMENT '二级品类名称',
`category1_id` STRING COMMENT '一级品类ID',
`category1_name` STRING COMMENT '一级品类名称',
`tm_id` STRING COMMENT '品牌ID',
`tm_name` STRING COMMENT '品牌名称',
`sku_attr_values` ARRAY<STRUCT<attr_id :STRING,
value_id :STRING,
attr_name :STRING,
value_name:STRING>> COMMENT '平台属性',
`sku_sale_attr_values` ARRAY<STRUCT<sale_attr_id :STRING,
sale_attr_value_id :STRING,
sale_attr_name :STRING,
sale_attr_value_name:STRING>> COMMENT '销售属性',
`create_time` STRING COMMENT '创建时间'
) COMMENT '商品维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_sku_full/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
load + save


两个结构体的字段查询语句使用收集函数:collect_list()把相同sku_id的的结构体聚合在一起;表的连结使用left jon。
insert overwrite table dim_sku_full partition(dt='2022-06-08')
select *
from(
sku.id,
sku.price,
sku.sku_name,
sku.sku_desc,
sku.weight,
sku.is_sale,
sku.spu_id,
spu.spu_name,
sku.category3_id,
c3.name,
c3.category2_id,
c2.name,
c2.category1_id,
c1.name,
sku.tm_id,
tm.tm_name,
attr.attrs,
sale_attr.sale_attrs,
sku.create_time
from ods_sku_info_full
where dt='2022-06-08'
)sku
left join
(select
id,
spu_name
from ods_spu_info_full
where dt='2022-06-08'
)spu on sku.spu_id=spu.id
left join
(select
id,
name,
category2_id
from ods_base_category3_full
where dt='2022-06-08'
)c3 on sku.category3_id=c3.id
left join
(select
id,
name,
category1_id
from ods_base_category2_full
where dt='2022-06-08'
)c2 on c3.category2_id=c2.id
left join
(select
id,
name
from ods_base_category1_full
where dt='2022-06-08'
)c1 on c2.category1_id=c1.id
left join
(select
id,
tm_name
from ods_base_trademark_full
where dt='2022-06-08'
)tm on sku.tm_id=tm.id
left join
(select
sku_id,
collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrs
from ods_sku_attr_value_full
where dt='2022-06-08'
group by sku_id
)attr on sku.id=attr.sku_id
left join
(select
sku_id,
collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrs
from ods_sku_sale_attr_value_full
where dt='2022-06-08'
group by sku_id
)sale_attr on sku.id=sale_attr.sku_id;
CTE写法:
with
sku as
(
select
id,
price,
sku_name,
sku_desc,
weight,
is_sale,
spu_id,
category3_id,
tm_id,
create_time
from ods_sku_info_full
where dt='2022-06-08'
),
spu as
(
select
id,
spu_name
from ods_spu_info_full
where dt='2022-06-08'
),
c3 as
(
select
id,
name,
category2_id
from ods_base_category3_full
where dt='2022-06-08'
),
c2 as
(
select
id,
name,
category1_id
from ods_base_category2_full
where dt='2022-06-08'
),
c1 as
(
select
id,
name
from ods_base_category1_full
where dt='2022-06-08'
),
tm as
(
select
id,
tm_name
from ods_base_trademark_full
where dt='2022-06-08'
),
attr as
(
select
sku_id,
collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrs
from ods_sku_attr_value_full
where dt='2022-06-08'
group by sku_id
),
sale_attr as
(
select
sku_id,
collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrs
from ods_sku_sale_attr_value_full
where dt='2022-06-08'
group by sku_id
)
insert overwrite table dim_sku_full partition(dt='2022-06-08')
select
sku.id,
sku.price,
sku.sku_name,
sku.sku_desc,
sku.weight,
sku.is_sale,
sku.spu_id,
spu.spu_name,
sku.category3_id,
c3.name,
c3.category2_id,
c2.name,
c2.category1_id,
c1.name,
sku.tm_id,
tm.tm_name,
attr.attrs,
sale_attr.sale_attrs,
sku.create_time
from sku
left join spu on sku.spu_id=spu.id
left join c3 on sku.category3_id=c3.id
left join c2 on c3.category2_id=c2.id
left join c1 on c2.category1_id=c1.id
left join tm on sku.tm_id=tm.id
left join attr on sku.id=attr.sku_id
left join sale_attr on sku.id=sale_attr.sku_id;
4.优惠券维度表:

建表语句:
DROP TABLE IF EXISTS dim_coupon_full;
CREATE EXTERNAL TABLE dim_coupon_full
(
`id` STRING COMMENT '优惠券编号',
`coupon_name` STRING COMMENT '优惠券名称',
`coupon_type_code` STRING COMMENT '优惠券类型编码',
`coupon_type_name` STRING COMMENT '优惠券类型名称',
`condition_amount` DECIMAL(16, 2) COMMENT '满额数',
`condition_num` BIGINT COMMENT '满件数',
`activity_id` STRING COMMENT '活动编号',
`benefit_amount` DECIMAL(16, 2) COMMENT '减免金额',
`benefit_discount` DECIMAL(16, 2) COMMENT '折扣',
`benefit_rule` STRING COMMENT '优惠规则:满元*减*元,满*件打*折',
`create_time` STRING COMMENT '创建时间',
`range_type_code` STRING COMMENT '优惠范围类型编码',
`range_type_name` STRING COMMENT '优惠范围类型名称',
`limit_num` BIGINT COMMENT '最多领取次数',
`taken_count` BIGINT COMMENT '已领取次数',
`start_time` STRING COMMENT '可以领取的开始时间',
`end_time` STRING COMMENT '可以领取的结束时间',
`operate_time` STRING COMMENT '修改时间',
`expire_time` STRING COMMENT '过期时间'
) COMMENT '优惠券维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_coupon_full/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:

insert overwrite table dim_coupon_full partition(dt='2022-06-08')
select
id,
coupon_name,
coupon_type,
coupon_dic.dic_name,
condition_amount,
condition_num,
activity_id,
benefit_amount,
benefit_discount,
case coupon_type
when '3201' then concat('满',condition_amount,'元减',benefit_amount,'元')
when '3202' then concat('满',condition_num,'件打', benefit_discount,' 折')
when '3203' then concat('减',benefit_amount,'元')
end benefit_rule,
create_time,
range_type,
range_dic.dic_name,
limit_num,
taken_count,
start_time,
end_time,
operate_time,
expire_time
from
(
select
id,
coupon_name,
coupon_type,
condition_amount,
condition_num,
activity_id,
benefit_amount,
benefit_discount,
create_time,
range_type,
limit_num,
taken_count,
start_time,
end_time,
operate_time,
expire_time
from ods_coupon_info_full
where dt='2022-06-08'
)ci
left join
(
select
dic_code,
dic_name
from ods_base_dic_full
where dt='2022-06-08'
and parent_code='32'
)coupon_dic
on ci.coupon_type=coupon_dic.dic_code
left join
(
select
dic_code,
dic_name
from ods_base_dic_full
where dt='2022-06-08'
and parent_code='33'
)range_dic
on ci.range_type=range_dic.dic_code;
5.活动维表:
建表语句:

DROP TABLE IF EXISTS dim_activity_full;
CREATE EXTERNAL TABLE dim_activity_full
(
`activity_rule_id` STRING COMMENT '活动规则ID',
`activity_id` STRING COMMENT '活动ID',
`activity_name` STRING COMMENT '活动名称',
`activity_type_code` STRING COMMENT '活动类型编码',
`activity_type_name` STRING COMMENT '活动类型名称',
`activity_desc` STRING COMMENT '活动描述',
`start_time` STRING COMMENT '开始时间',
`end_time` STRING COMMENT '结束时间',
`create_time` STRING COMMENT '创建时间',
`condition_amount` DECIMAL(16, 2) COMMENT '满减金额',
`condition_num` BIGINT COMMENT '满减件数',
`benefit_amount` DECIMAL(16, 2) COMMENT '优惠金额',
`benefit_discount` DECIMAL(16, 2) COMMENT '优惠折扣',
`benefit_rule` STRING COMMENT '优惠规则',
`benefit_level` STRING COMMENT '优惠级别'
) COMMENT '活动维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_activity_full/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
insert overwrite table dim_activity_full partition(dt='2022-06-08')
select
rule.id,
info.id,
activity_name,
rule.activity_type,
dic.dic_name,
activity_desc,
start_time,
end_time,
create_time,
condition_amount,
condition_num,
benefit_amount,
benefit_discount,
case rule.activity_type
when '3101' then concat('满',condition_amount,'元减',benefit_amount,'元')
when '3102' then concat('满',condition_num,'件打', benefit_discount,' 折')
when '3103' then concat('打', benefit_discount,'折')
end benefit_rule,
benefit_level
from
(
select
id,
activity_id,
activity_type,
condition_amount,
condition_num,
benefit_amount,
benefit_discount,
benefit_level
from ods_activity_rule_full
where dt='2022-06-08'
)rule
left join
(
select
id,
activity_name,
activity_type,
activity_desc,
start_time,
end_time,
create_time
from ods_activity_info_full
where dt='2022-06-08'
)info
on rule.activity_id=info.id
left join
(
select
dic_code,
dic_name
from ods_base_dic_full
where dt='2022-06-08'
and parent_code='31'
)dic
on rule.activity_type=dic.dic_code;
8.日期维度表:
不需要分区,需要创建临时表,数据从临时表导入
建表语句:
DROP TABLE IF EXISTS dim_date;
CREATE EXTERNAL TABLE dim_date
(
`date_id` STRING COMMENT '日期ID',
`week_id` STRING COMMENT '周ID,一年中的第几周',
`week_day` STRING COMMENT '周几',
`day` STRING COMMENT '每月的第几天',
`month` STRING COMMENT '一年中的第几月',
`quarter` STRING COMMENT '一年中的第几季度',
`year` STRING COMMENT '年份',
`is_workday` STRING COMMENT '是否是工作日',
`holiday_id` STRING COMMENT '节假日'
) COMMENT '日期维度表'
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_date/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
DROP TABLE IF EXISTS tmp_dim_date_info;
CREATE EXTERNAL TABLE tmp_dim_date_info (
`date_id` STRING COMMENT '日',
`week_id` STRING COMMENT '周ID',
`week_day` STRING COMMENT '周几',
`day` STRING COMMENT '每月的第几天',
`month` STRING COMMENT '第几月',
`quarter` STRING COMMENT '第几季度',
`year` STRING COMMENT '年',
`is_workday` STRING COMMENT '是否是工作日',
`holiday_id` STRING COMMENT '节假日'
) COMMENT '时间维度表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/tmp/tmp_dim_date_info/';
将数据文件上传到HFDS上临时表路径/warehouse/gmall/tmp/tmp_dim_date_info
insert overwrite table dim_date select * from tmp_dim_date_info;
9.用户维度表:
理解拉链表
维度属性通常不是静态的,而是会随时间变化的,数据仓库的一个重要特点就是反映历史的变化,所以如何保存维度的历史状态是维度设计的重要工作之一。保存维度数据的历史状态,通常有以下两种做法,分别是全量快照表和拉链表。
1. 全量快照表:离线数据仓库的计算周期通常为每天一次,所以可以每天保存一份全量的维度数据。这种方式的优点和缺点都很明显。
优点是简单而有效,开发和维护成本低,且方便理解和使用。
缺点是浪费存储空间,尤其是当数据的变化比例比较低时。
拉链表的意义就在于能够更加高效的保存维度信息的历史状态。
(2)拉链表
![]()





首日:全量。每日:曾量


首日装载:
insert overwrite table dim_user_zip partition (dt = '9999-12-31')
select data.id,
concat(substr(data.name, 1, 1), '*') name,
if(data.phone_num regexp '^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$',
concat(substr(data.phone_num, 1, 3), '*'), null) phone_num,
if(data.email regexp '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$',
concat('*@', split(data.email, '@')[1]), null) email,
data.user_level,
data.birthday,
data.gender,
data.create_time,
data.operate_time,
'2022-06-08' start_date,
'9999-12-31' end_date
from ods_user_info_inc
where dt = '2022-06-08'
and type = 'bootstrap-insert';
每日装载:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dim_user_zip partition (dt)
select id,
name,
phone_num,
email,
user_level,
birthday,
gender,
create_time,
operate_time,
start_date,
if(rn = 2, date_sub('2022-06-09', 1), end_date) end_date,
if(rn = 1, '9999-12-31', date_sub('2022-06-09', 1)) dt
from (
select id,
name,
phone_num,
email,
user_level,
birthday,
gender,
create_time,
operate_time,
start_date,
end_date,
row_number() over (partition by id order by start_date desc) rn
from (
select id,
name,
phone_num,
email,
user_level,
birthday,
gender,
create_time,
operate_time,
start_date,
end_date
from dim_user_zip
where dt = '9999-12-31'
union
select id,
concat(substr(name, 1, 1), '*') name,
if(phone_num regexp
'^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$',
concat(substr(phone_num, 1, 3), '*'), null) phone_num,
if(email regexp '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$',
concat('*@', split(email, '@')[1]), null) email,
user_level,
birthday,
gender,
create_time,
operate_time,
'2022-06-09' start_date,
'9999-12-31' end_date
from (
select data.id,
data.name,
data.phone_num,
data.email,
data.user_level,
data.birthday,
data.gender,
data.create_time,
data.operate_time,
row_number() over (partition by data.id order by ts desc) rn
from ods_user_info_inc
where dt = '2022-06-09'
) t1
where rn = 1
) t2
) t3;
5.DWD层构建:
1.设计要点:
(1)DWD层的设计依据是维度建模理论,该层存储维度模型的事实表。
(2)DWD层的数据存储格式为orc列式存储+snappy压缩。
(3)DWD层表名的命名规范为dwd_数据域_表名_单分区增量全量标识(inc/full)


2.事实表:

(1)概述:

事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设计。其包含与该业务过程有关的维度引用(维度表外键)以及该业务过程的度量(通常是可累加的数字类型字段)。事实表通常比较“细长”,即列较少,但行较多,且行的增速快。
(2)分类:
事务事实表、周期快照事实表、累积快照事实表
a:事务型事实表:、

事务型事实表用来记录各业务过程,它保存的是各业务过程的原子操作事件,即最细粒度的操作事件。粒度是指事实表中一行数据所表达的业务细节程度。
事务型事实表可用于分析与各业务过程相关的各项统计指标,由于其保存了最细粒度的记录,可以提供最大限度的灵活性,可以支持无法预期的各种细节层次的统计需求。
设计步骤:选择业务过程→声明粒度→确认维度→确认事实

3.交易域加购事务事实表

建表语句:
DROP TABLE IF EXISTS dwd_trade_cart_add_inc;
CREATE EXTERNAL TABLE dwd_trade_cart_add_inc
(
`id` STRING COMMENT '编号',
`user_id` STRING COMMENT '用户ID',
`sku_id` STRING COMMENT 'SKU_ID',
`date_id` STRING COMMENT '日期ID',
`create_time` STRING COMMENT '加购时间',
`sku_num` BIGINT COMMENT '加购物车件数'
) COMMENT '交易域加购事务事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_trade_cart_add_inc/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
首日:


每日:
4.交易域下单事务事实表:
建表语句:

数据装载:
当数据装载的时候,我们需要从哪些表中取数据?如图
首日:
动态分区
其中null的处理:需要用nvl( ,0)

每日:
静态分区:
5.交易域支付成功事务事实表:
建表语句:

数据装载:
load + save
首日:
每日:
6.交易域购物车周期快照事实表:
事实表:周期型快照事实表
(1)概述:
周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,主要用于分析一些存量型(例如商品库存,账户余额)或者状态型(空气温度,行驶速度)指标。
对于商品库存、账户余额这些存量型指标,业务系统中通常就会计算并保存最新结果,所以定期同步一份全量数据到数据仓库,构建周期型快照事实表,就能轻松应对此类统计需求,而无需再对事务型事实表中大量的历史记录进行聚合了。
对于空气温度、行驶速度这些状态型指标,由于它们的值往往是连续的,我们无法捕获其变动的原子事务操作,所以无法使用事务型事实表统计此类需求。而只能定期对其进行采样,构建周期型快照事实表。


建表语句:
DROP TABLE IF EXISTS dwd_trade_cart_full;
CREATE EXTERNAL TABLE dwd_trade_cart_full
(
`id` STRING COMMENT '编号',
`user_id` STRING COMMENT '用户ID',
`sku_id` STRING COMMENT 'SKU_ID',
`sku_name` STRING COMMENT '商品名称',
`sku_num` BIGINT COMMENT '现存商品件数'
) COMMENT '交易域购物车周期快照事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_trade_cart_full/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
insert overwrite table dwd_trade_cart_full partition(dt='2022-06-08')
select
id,
user_id,
sku_id,
sku_name,
sku_num
from ods_cart_info_full
where dt='2022-06-08'
and is_ordered='0';
7.交易域交易流程累积快照事实表:
建表语句:
DROP TABLE IF EXISTS dwd_trade_trade_flow_acc;
CREATE EXTERNAL TABLE dwd_trade_trade_flow_acc
(
`order_id` STRING COMMENT '订单ID',
`user_id` STRING COMMENT '用户ID',
`province_id` STRING COMMENT '省份ID',
`order_date_id` STRING COMMENT '下单日期ID',
`order_time` STRING COMMENT '下单时间',
`payment_date_id` STRING COMMENT '支付日期ID',
`payment_time` STRING COMMENT '支付时间',
`finish_date_id` STRING COMMENT '确认收货日期ID',
`finish_time` STRING COMMENT '确认收货时间',
`order_original_amount` DECIMAL(16, 2) COMMENT '下单原始价格',
`order_activity_amount` DECIMAL(16, 2) COMMENT '下单活动优惠分摊',
`order_coupon_amount` DECIMAL(16, 2) COMMENT '下单优惠券优惠分摊',
`order_total_amount` DECIMAL(16, 2) COMMENT '下单最终价格分摊',
`payment_amount` DECIMAL(16, 2) COMMENT '支付金额'
) COMMENT '交易域交易流程累积快照事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_trade_trade_flow_acc/'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
首日:
分区策略:使用确认收货的时间为分区

![]()

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_trade_flow_acc partition(dt)
select
oi.id,
user_id,
province_id,
date_format(create_time,'yyyy-MM-dd'),
create_time,
date_format(callback_time,'yyyy-MM-dd'),
callback_time,
date_format(finish_time,'yyyy-MM-dd'),
finish_time,
original_total_amount,
activity_reduce_amount,
coupon_reduce_amount,
total_amount,
nvl(payment_amount,0.0),
nvl(date_format(finish_time,'yyyy-MM-dd'),'9999-12-31')
from
(
select
data.id,
data.user_id,
data.province_id,
data.create_time,
data.original_total_amount,
data.activity_reduce_amount,
data.coupon_reduce_amount,
data.total_amount
from ods_order_info_inc
where dt='2022-06-08'
and type='bootstrap-insert'
)oi
left join
(
select
data.order_id,
data.callback_time,
data.total_amount payment_amount
from ods_payment_info_inc
where dt='2022-06-08'
and type='bootstrap-insert'
and data.payment_status='1602'
)pi
on oi.id=pi.order_id
left join
(
select
data.order_id,
data.create_time finish_time
from ods_order_status_log_inc
where dt='2022-06-08'
and type='bootstrap-insert'
and data.order_status='1004'
)log
on oi.id=log.order_id;
每日:



set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_trade_flow_acc partition(dt)
select
oi.order_id,
user_id,
province_id,
order_date_id,
order_time,
nvl(oi.payment_date_id,pi.payment_date_id),
nvl(oi.payment_time,pi.payment_time),
nvl(oi.finish_date_id,log.finish_date_id),
nvl(oi.finish_time,log.finish_time),
order_original_amount,
order_activity_amount,
order_coupon_amount,
order_total_amount,
nvl(oi.payment_amount,pi.payment_amount),
nvl(nvl(oi.finish_time,log.finish_time),'9999-12-31')
from
(
select
order_id,
user_id,
province_id,
order_date_id,
order_time,
payment_date_id,
payment_time,
finish_date_id,
finish_time,
order_original_amount,
order_activity_amount,
order_coupon_amount,
order_total_amount,
payment_amount
from dwd_trade_trade_flow_acc
where dt='9999-12-31'
union all
select
data.id,
data.user_id,
data.province_id,
date_format(data.create_time,'yyyy-MM-dd') order_date_id,
data.create_time,
null payment_date_id,
null payment_time,
null finish_date_id,
null finish_time,
data.original_total_amount,
data.activity_reduce_amount,
data.coupon_reduce_amount,
data.total_amount,
null payment_amount
from ods_order_info_inc
where dt='2022-06-09'
and type='insert'
)oi
left join
(
select
data.order_id,
date_format(data.callback_time,'yyyy-MM-dd') payment_date_id,
data.callback_time payment_time,
data.total_amount payment_amount
from ods_payment_info_inc
where dt='2022-06-09'
and type='update'
and array_contains(map_keys(old),'payment_status')
and data.payment_status='1602'
)pi
on oi.order_id=pi.order_id
left join
(
select
data.order_id,
date_format(data.create_time,'yyyy-MM-dd') finish_date_id,
data.create_time finish_time
from ods_order_status_log_inc
where dt='2022-06-09'
and type='insert'
and data.order_status='1004'
)log
on oi.order_id=log.order_id;
8. 工具域优惠券使用(支付)事务事实表
建表语句
DROP TABLE IF EXISTS dwd_tool_coupon_used_inc;
CREATE EXTERNAL TABLE dwd_tool_coupon_used_inc
(
`id` STRING COMMENT '编号',
`coupon_id` STRING COMMENT '优惠券ID',
`user_id` STRING COMMENT '用户ID',
`order_id` STRING COMMENT '订单ID',
`date_id` STRING COMMENT '日期ID',
`payment_time` STRING COMMENT '使用(支付)时间'
) COMMENT '优惠券使用(支付)事务事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_tool_coupon_used_inc/'
TBLPROPERTIES ("orc.compress" = "snappy");
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_tool_coupon_used_inc partition(dt)
select
data.id,
data.coupon_id,
data.user_id,
data.order_id,
date_format(data.used_time,'yyyy-MM-dd') date_id,
data.used_time,
date_format(data.used_time,'yyyy-MM-dd')
from ods_coupon_use_inc
where dt='2022-06-08'
and type='bootstrap-insert'
and data.used_time is not null;
每日:
insert overwrite table dwd_tool_coupon_used_inc partition(dt='2022-06-09')
select
data.id,
data.coupon_id,
data.user_id,
data.order_id,
date_format(data.used_time,'yyyy-MM-dd') date_id,
data.used_time
from ods_coupon_use_inc
where dt='2022-06-09'
and type='update'
and array_contains(map_keys(old),'used_time');
9.互动域收藏商品事务事实表
建表:
DROP TABLE IF EXISTS dwd_interaction_favor_add_inc;
CREATE EXTERNAL TABLE dwd_interaction_favor_add_inc
(
`id` STRING COMMENT '编号',
`user_id` STRING COMMENT '用户ID',
`sku_id` STRING COMMENT 'SKU_ID',
`date_id` STRING COMMENT '日期ID',
`create_time` STRING COMMENT '收藏时间'
) COMMENT '互动域收藏商品事务事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_interaction_favor_add_inc/'
TBLPROPERTIES ("orc.compress" = "snappy");
装载:
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_interaction_favor_add_inc partition(dt)
select
data.id,
data.user_id,
data.sku_id,
date_format(data.create_time,'yyyy-MM-dd') date_id,
data.create_time,
date_format(data.create_time,'yyyy-MM-dd')
from ods_favor_info_inc
where dt='2022-06-08'
and type = 'bootstrap-insert';
每日:
insert overwrite table dwd_interaction_favor_add_inc partition(dt='2022-06-09')
select
data.id,
data.user_id,
data.sku_id,
date_format(data.create_time,'yyyy-MM-dd') date_id,
data.create_time
from ods_favor_info_inc
where dt='2022-06-09'
and type = 'insert';
10.流量域页面浏览事务事实表
建表语句:
DROP TABLE IF EXISTS dwd_traffic_page_view_inc;
CREATE EXTERNAL TABLE dwd_traffic_page_view_inc
(
`province_id` STRING COMMENT '省份ID',
`brand` STRING COMMENT '手机品牌',
`channel` STRING COMMENT '渠道',
`is_new` STRING COMMENT '是否首次启动',
`model` STRING COMMENT '手机型号',
`mid_id` STRING COMMENT '设备ID',
`operate_system` STRING COMMENT '操作系统',
`user_id` STRING COMMENT '会员ID',
`version_code` STRING COMMENT 'APP版本号',
`page_item` STRING COMMENT '目标ID',
`page_item_type` STRING COMMENT '目标类型',
`last_page_id` STRING COMMENT '上页ID',
`page_id` STRING COMMENT '页面ID ',
`from_pos_id` STRING COMMENT '点击坑位ID',
`from_pos_seq` STRING COMMENT '点击坑位位置',
`refer_id` STRING COMMENT '营销渠道ID',
`date_id` STRING COMMENT '日期ID',
`view_time` STRING COMMENT '跳入时间',
`session_id` STRING COMMENT '所属会话ID',
`during_time` BIGINT COMMENT '持续时间毫秒'
) COMMENT '流量域页面浏览事务事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_traffic_page_view_inc'
TBLPROPERTIES ('orc.compress' = 'snappy');
装载数据:
set hive.cbo.enable=false;
insert overwrite table dwd_traffic_page_view_inc partition (dt='2022-06-08')
select
common.ar province_id,
common.ba brand,
common.ch channel,
common.is_new is_new,
common.md model,
common.mid mid_id,
common.os operate_system,
common.uid user_id,
common.vc version_code,
page.item page_item,
page.item_type page_item_type,
page.last_page_id,
page.page_id,
page.from_pos_id,
page.from_pos_seq,
page.refer_id,
date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,
date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') view_time,
common.sid session_id,
page.during_time
from ods_log_inc
where dt='2022-06-08'
and page is not null;
set hive.cbo.enable=true;
11.用户域用户注册事务事实表
建表语句:
DROP TABLE IF EXISTS dwd_user_register_inc;
CREATE EXTERNAL TABLE dwd_user_register_inc
(
`user_id` STRING COMMENT '用户ID',
`date_id` STRING COMMENT '日期ID',
`create_time` STRING COMMENT '注册时间',
`channel` STRING COMMENT '应用下载渠道',
`province_id` STRING COMMENT '省份ID',
`version_code` STRING COMMENT '应用版本',
`mid_id` STRING COMMENT '设备ID',
`brand` STRING COMMENT '设备品牌',
`model` STRING COMMENT '设备型号',
`operate_system` STRING COMMENT '设备操作系统'
) COMMENT '用户域用户注册事务事实表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_user_register_inc/'
TBLPROPERTIES ("orc.compress" = "snappy");
装载数据:
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_user_register_inc partition(dt)
select
ui.user_id,
date_format(create_time,'yyyy-MM-dd') date_id,
create_time,
channel,
province_id,
version_code,
mid_id,
brand,
model,
operate_system,
date_format(create_time,'yyyy-MM-dd')
from
(
select
data.id user_id,
data.create_time
from ods_user_info_inc
where dt='2022-06-08'
and type='bootstrap-insert'
)ui
left join
(
select
common.ar province_id,
common.ba brand,
common.ch channel,
common.md model,
common.mid mid_id,
common.os operate_system,
common.uid user_id,
common.vc version_code
from ods_log_inc
where dt='2022-06-08'
and page.page_id='register'
and common.uid is not null
)log
on ui.user_id=log.user_id;
每日:
insert overwrite table dwd_user_register_inc partition(dt='2022-06-09')
select
ui.user_id,
date_format(create_time,'yyyy-MM-dd') date_id,
create_time,
channel,
province_id,
version_code,
mid_id,
brand,
model,
operate_system
from
(
select
data.id user_id,
data.create_time
from ods_user_info_inc
where dt='2022-06-09'
and type='insert'
)ui
left join
(
select
common.ar province_id,
common.ba brand,
common.ch channel,
common.md model,
common.mid mid_id,
common.os operate_system,
common.uid user_id,
common.vc version_code
from ods_log_inc
where dt='2022-06-09'
and page.page_id='register'
and common.uid is not null
)log
on ui.user_id=log.user_id;
12.用户域用户登录事务事实表
insert overwrite table dwd_user_login_inc partition (dt = '2022-06-08')
select user_id,
date_format(from_utc_timestamp(ts, 'GMT+8'), 'yyyy-MM-dd') date_id,
date_format(from_utc_timestamp(ts, 'GMT+8'), 'yyyy-MM-dd HH:mm:ss') login_time,
channel,
province_id,
version_code,
mid_id,
brand,
model,
operate_system
from (
select user_id,
channel,
province_id,
version_code,
mid_id,
brand,
model,
operate_system,
ts
from (select common.uid user_id,
common.ch channel,
common.ar province_id,
common.vc version_code,
common.mid mid_id,
common.ba brand,
common.md model,
common.os operate_system,
ts,
row_number() over (partition by common.sid order by ts) rn
from ods_log_inc
where dt = '2022-06-08'
and page is not null
and common.uid is not null) t1
where rn = 1
) t2;


6.DWS层构建(*)




预聚合,把中间结果保存下来,提前做计算,在多个需求中可重复使用,提高效率

1.设计要点:
设计要点:
(1)DWS层的设计参考指标体系。
(2)DWS层的数据存储格式为orc列式存储+snappy压缩。
(3)DWS层表名的命名规范为dws_数据域_统计粒度_业务过程_统计周期(1d/nd/td)。
注:1d表示最近1日,nd表示最近n日,td表示历史至今。
2.最近一日汇总表:
2.1 交易与用户商品粒度订单最近一日汇总表:
2.2交易域用户粒度加购最近1日汇总表:
建表语句:
DROP TABLE IF EXISTS dws_trade_user_cart_add_1d;
CREATE EXTERNAL TABLE dws_trade_user_cart_add_1d
(
`user_id` STRING COMMENT '用户ID',
`cart_add_count_1d` BIGINT COMMENT '最近1日加购次数',
`cart_add_num_1d` BIGINT COMMENT '最近1日加购商品件数'
) COMMENT '交易域用户粒度加购最近1日汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_trade_user_cart_add_1d'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dws_trade_user_cart_add_1d partition(dt)
select
user_id,
count(*),
sum(sku_num),
dt
from dwd_trade_cart_add_inc
group by user_id,dt;
每日:
insert overwrite table dws_trade_user_cart_add_1d partition(dt='2022-06-09')
select
user_id,
count(*),
sum(sku_num)
from dwd_trade_cart_add_inc
where dt='2022-06-09'
group by user_id;
2.3交易域用户粒度支付最近1日汇总表:
建表:
DROP TABLE IF EXISTS dws_trade_user_payment_1d;
CREATE EXTERNAL TABLE dws_trade_user_payment_1d
(
`user_id` STRING COMMENT '用户ID',
`payment_count_1d` BIGINT COMMENT '最近1日支付次数',
`payment_num_1d` BIGINT COMMENT '最近1日支付商品件数',
`payment_amount_1d` DECIMAL(16, 2) COMMENT '最近1日支付金额'
) COMMENT '交易域用户粒度支付最近1日汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_trade_user_payment_1d'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dws_trade_user_payment_1d partition(dt)
select
user_id,
count(distinct(order_id)),
sum(sku_num),
sum(split_payment_amount),
dt
from dwd_trade_pay_detail_suc_inc
group by user_id,dt;
每日:
insert overwrite table dws_trade_user_payment_1d partition(dt='2022-06-09')
select
user_id,
count(distinct(order_id)),
sum(sku_num),
sum(split_payment_amount)
from dwd_trade_pay_detail_suc_inc
where dt='2022-06-09'
group by user_id;
2.4交易域省份粒度订单最近1日汇总表:
建表语句:
DROP TABLE IF EXISTS dws_trade_province_order_1d;
CREATE EXTERNAL TABLE dws_trade_province_order_1d
(
`province_id` STRING COMMENT '省份ID',
`province_name` STRING COMMENT '省份名称',
`area_code` STRING COMMENT '地区编码',
`iso_code` STRING COMMENT '旧版国际标准地区编码',
`iso_3166_2` STRING COMMENT '新版国际标准地区编码',
`order_count_1d` BIGINT COMMENT '最近1日下单次数',
`order_original_amount_1d` DECIMAL(16, 2) COMMENT '最近1日下单原始金额',
`activity_reduce_amount_1d` DECIMAL(16, 2) COMMENT '最近1日下单活动优惠金额',
`coupon_reduce_amount_1d` DECIMAL(16, 2) COMMENT '最近1日下单优惠券优惠金额',
`order_total_amount_1d` DECIMAL(16, 2) COMMENT '最近1日下单最终金额'
) COMMENT '交易域省份粒度订单最近1日汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_trade_province_order_1d'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dws_trade_province_order_1d partition(dt)
select
province_id,
province_name,
area_code,
iso_code,
iso_3166_2,
order_count_1d,
order_original_amount_1d,
activity_reduce_amount_1d,
coupon_reduce_amount_1d,
order_total_amount_1d,
dt
from
(
select
province_id,
count(distinct(order_id)) order_count_1d,
sum(split_original_amount) order_original_amount_1d,
sum(nvl(split_activity_amount,0)) activity_reduce_amount_1d,
sum(nvl(split_coupon_amount,0)) coupon_reduce_amount_1d,
sum(split_total_amount) order_total_amount_1d,
dt
from dwd_trade_order_detail_inc
group by province_id,dt
)o
left join
(
select
id,
province_name,
area_code,
iso_code,
iso_3166_2
from dim_province_full
where dt='2022-06-08'
)p
on o.province_id=p.id;
每日:
insert overwrite table dws_trade_province_order_1d partition(dt='2022-06-09')
select
province_id,
province_name,
area_code,
iso_code,
iso_3166_2,
order_count_1d,
order_original_amount_1d,
activity_reduce_amount_1d,
coupon_reduce_amount_1d,
order_total_amount_1d
from
(
select
province_id,
count(distinct(order_id)) order_count_1d,
sum(split_original_amount) order_original_amount_1d,
sum(nvl(split_activity_amount,0)) activity_reduce_amount_1d,
sum(nvl(split_coupon_amount,0)) coupon_reduce_amount_1d,
sum(split_total_amount) order_total_amount_1d
from dwd_trade_order_detail_inc
where dt='2022-06-09'
group by province_id
)o
left join
(
select
id,
province_name,
area_code,
iso_code,
iso_3166_2
from dim_province_full
where dt='2022-06-09'
)p
on o.province_id=p.id;
2.5 工具域用户优惠券粒度优惠券使用(支付)最近1日汇总表:
建表语句:
DROP TABLE IF EXISTS dws_tool_user_coupon_coupon_used_1d;
CREATE EXTERNAL TABLE dws_tool_user_coupon_coupon_used_1d
(
`user_id` STRING COMMENT '用户ID',
`coupon_id` STRING COMMENT '优惠券ID',
`coupon_name` STRING COMMENT '优惠券名称',
`coupon_type_code` STRING COMMENT '优惠券类型编码',
`coupon_type_name` STRING COMMENT '优惠券类型名称',
`benefit_rule` STRING COMMENT '优惠规则',
`used_count_1d` STRING COMMENT '使用(支付)次数'
) COMMENT '工具域用户优惠券粒度优惠券使用(支付)最近1日汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_tool_user_coupon_coupon_used_1d'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
首日:
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dws_tool_user_coupon_coupon_used_1d partition(dt)
select
user_id,
coupon_id,
coupon_name,
coupon_type_code,
coupon_type_name,
benefit_rule,
used_count,
dt
from
(
select
dt,
user_id,
coupon_id,
count(*) used_count
from dwd_tool_coupon_used_inc
group by dt,user_id,coupon_id
)t1
left join
(
select
id,
coupon_name,
coupon_type_code,
coupon_type_name,
benefit_rule
from dim_coupon_full
where dt='2022-06-08'
)t2
on t1.coupon_id=t2.id;
每日:
insert overwrite table dws_tool_user_coupon_coupon_used_1d partition(dt='2022-06-09')
select
user_id,
coupon_id,
coupon_name,
coupon_type_code,
coupon_type_name,
benefit_rule,
used_count
from
(
select
user_id,
coupon_id,
count(*) used_count
from dwd_tool_coupon_used_inc
where dt='2022-06-09'
group by user_id,coupon_id
)t1
left join
(
select
id,
coupon_name,
coupon_type_code,
coupon_type_name,
benefit_rule
from dim_coupon_full
where dt='2022-06-09'
)t2
on t1.coupon_id=t2.id;
2.6流量域会话粒度页面浏览最近1日汇总表:
建表语句:
DROP TABLE IF EXISTS dws_traffic_session_page_view_1d;
CREATE EXTERNAL TABLE dws_traffic_session_page_view_1d
(
`session_id` STRING COMMENT '会话ID',
`mid_id` string comment '设备ID',
`brand` string comment '手机品牌',
`model` string comment '手机型号',
`operate_system` string comment '操作系统',
`version_code` string comment 'APP版本号',
`channel` string comment '渠道',
`during_time_1d` BIGINT COMMENT '最近1日浏览时长',
`page_count_1d` BIGINT COMMENT '最近1日浏览页面数'
) COMMENT '流量域会话粒度页面浏览最近1日汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_traffic_session_page_view_1d'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
从日志数据中装载
insert overwrite table dws_traffic_session_page_view_1d partition(dt='2022-06-08')
select
session_id,
mid_id,
brand,
model,
operate_system,
version_code,
channel,
sum(during_time),
count(*)
from dwd_traffic_page_view_inc
where dt='2022-06-08'
group by session_id,mid_id,brand,model,operate_system,version_code,channel;
3.最近n日汇总表:
3.1 交易域省份粒度订单最近n日汇总表:
建表语句:
DROP TABLE IF EXISTS dws_trade_province_order_nd;
CREATE EXTERNAL TABLE dws_trade_province_order_nd
(
`province_id` STRING COMMENT '省份ID',
`province_name` STRING COMMENT '省份名称',
`area_code` STRING COMMENT '地区编码',
`iso_code` STRING COMMENT '旧版国际标准地区编码',
`iso_3166_2` STRING COMMENT '新版国际标准地区编码',
`order_count_7d` BIGINT COMMENT '最近7日下单次数',
`order_original_amount_7d` DECIMAL(16, 2) COMMENT '最近7日下单原始金额',
`activity_reduce_amount_7d` DECIMAL(16, 2) COMMENT '最近7日下单活动优惠金额',
`coupon_reduce_amount_7d` DECIMAL(16, 2) COMMENT '最近7日下单优惠券优惠金额',
`order_total_amount_7d` DECIMAL(16, 2) COMMENT '最近7日下单最终金额',
`order_count_30d` BIGINT COMMENT '最近30日下单次数',
`order_original_amount_30d` DECIMAL(16, 2) COMMENT '最近30日下单原始金额',
`activity_reduce_amount_30d` DECIMAL(16, 2) COMMENT '最近30日下单活动优惠金额',
`coupon_reduce_amount_30d` DECIMAL(16, 2) COMMENT '最近30日下单优惠券优惠金额',
`order_total_amount_30d` DECIMAL(16, 2) COMMENT '最近30日下单最终金额'
) COMMENT '交易域省份粒度订单最近n日汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_trade_province_order_nd'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:
insert overwrite table dws_trade_province_order_nd partition(dt='2022-06-08')
select
province_id,
province_name,
area_code,
iso_code,
iso_3166_2,
sum(if(dt>=date_add('2022-06-08',-6),order_count_1d,0)),
sum(if(dt>=date_add('2022-06-08',-6),order_original_amount_1d,0)),
sum(if(dt>=date_add('2022-06-08',-6),activity_reduce_amount_1d,0)),
sum(if(dt>=date_add('2022-06-08',-6),coupon_reduce_amount_1d,0)),
sum(if(dt>=date_add('2022-06-08',-6),order_total_amount_1d,0)),
sum(order_count_1d),
sum(order_original_amount_1d),
sum(activity_reduce_amount_1d),
sum(coupon_reduce_amount_1d),
sum(order_total_amount_1d)
from dws_trade_province_order_1d
where dt>=date_add('2022-06-08',-29)
and dt<='2022-06-08'
group by province_id,province_name,area_code,iso_code,iso_3166_2;
4.历史至今汇总表:
4.1 交易域用户粒度订单历史至今汇总表:
建表语句:
DROP TABLE IF EXISTS dws_trade_user_order_td;
CREATE EXTERNAL TABLE dws_trade_user_order_td
(
`user_id` STRING COMMENT '用户ID',
`order_date_first` STRING COMMENT '历史至今首次下单日期',
`order_date_last` STRING COMMENT '历史至今末次下单日期',
`order_count_td` BIGINT COMMENT '历史至今下单次数',
`order_num_td` BIGINT COMMENT '历史至今购买商品件数',
`original_amount_td` DECIMAL(16, 2) COMMENT '历史至今下单原始金额',
`activity_reduce_amount_td` DECIMAL(16, 2) COMMENT '历史至今下单活动优惠金额',
`coupon_reduce_amount_td` DECIMAL(16, 2) COMMENT '历史至今下单优惠券优惠金额',
`total_amount_td` DECIMAL(16, 2) COMMENT '历史至今下单最终金额'
) COMMENT '交易域用户粒度订单历史至今汇总表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dws/dws_trade_user_order_td'
TBLPROPERTIES ('orc.compress' = 'snappy');
数据装载:

首日:
insert overwrite table dws_trade_user_order_td partition(dt='2022-06-08')
select
user_id,
min(dt) order_date_first,
max(dt) order_date_last,
sum(order_count_1d) order_count,
sum(order_num_1d) order_num,
sum(order_original_amount_1d) original_amount,
sum(activity_reduce_amount_1d) activity_reduce_amount,
sum(coupon_reduce_amount_1d) coupon_reduce_amount,
sum(order_total_amount_1d) total_amount
from dws_trade_user_order_1d
group by user_id;
② 每日装载
a)通过full outer join实现
insert overwrite table dws_trade_user_order_td partition (dt = '2022-06-09')
select nvl(old.user_id, new.user_id),
if(old.user_id is not null, old.order_date_first, '2022-06-09'),
if(new.user_id is not null, '2022-06-09', old.order_date_last),
nvl(old.order_count_td, 0) + nvl(new.order_count_1d, 0),
nvl(old.order_num_td, 0) + nvl(new.order_num_1d, 0),
nvl(old.original_amount_td, 0) + nvl(new.order_original_amount_1d, 0),
nvl(old.activity_reduce_amount_td, 0) + nvl(new.activity_reduce_amount_1d, 0),
nvl(old.coupon_reduce_amount_td, 0) + nvl(new.coupon_reduce_amount_1d, 0),
nvl(old.total_amount_td, 0) + nvl(new.order_total_amount_1d, 0)
from (
select user_id,
order_date_first,
order_date_last,
order_count_td,
order_num_td,
original_amount_td,
activity_reduce_amount_td,
coupon_reduce_amount_td,
total_amount_td
from dws_trade_user_order_td
where dt = date_add('2022-06-09', -1)
) old
full outer join
(
select user_id,
order_count_1d,
order_num_1d,
order_original_amount_1d,
activity_reduce_amount_1d,
coupon_reduce_amount_1d,
order_total_amount_1d
from dws_trade_user_order_1d
where dt = '2022-06-09'
) new
on old.user_id = new.user_id;
每日:
insert overwrite table dws_trade_user_order_td partition(dt='2022-06-09')
select user_id,
min(order_date_first) order_date_first,
max(order_date_last) order_date_last,
sum(order_count_td) order_count_td,
sum(order_num_td) order_num_td,
sum(original_amount_td) original_amount_td,
sum(activity_reduce_amount_td) activity_reduce_amount_td,
sum(coupon_reduce_amount_td) coupon_reduce_amount_td,
sum(total_amount_td) total_amount_td
from (
select user_id,
order_date_first,
order_date_last,
order_count_td,
order_num_td,
original_amount_td,
activity_reduce_amount_td,
coupon_reduce_amount_td,
total_amount_td
from dws_trade_user_order_td
where dt = date_add('2022-06-09', -1)
union all
select user_id,
'2022-06-09' order_date_first,
'2022-06-09' order_date_last,
order_count_1d,
order_num_1d,
order_original_amount_1d,
activity_reduce_amount_1d,
coupon_reduce_amount_1d,
order_total_amount_1d
from dws_trade_user_order_1d
where dt = '2022-06-09') t1
group by user_id;
4.2 用户域用户粒度登录历史至今汇总表
建表语句:
数据装载:
7.ADS层构建


1. 商品主题-各品牌商品下单统计(最近1-7-30天)
需求说明:
需求说明如下
|
统计周期 |
统计粒度 |
指标 |
说明 |
|
最近1、7、30日 |
品牌 |
下单数 |
略 |
|
最近1、7、30日 |
品牌 |
下单人数 |
略 |
指标分析:
原子指标,派生指标




建表语句:
DROP TABLE IF EXISTS ads_order_stats_by_tm;
CREATE EXTERNAL TABLE ads_order_stats_by_tm
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
`tm_id` STRING COMMENT '品牌ID',
`tm_name` STRING COMMENT '品牌名称',
`order_count` BIGINT COMMENT '下单数',
`order_user_count` BIGINT COMMENT '下单人数'
) COMMENT '各品牌商品下单统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_order_stats_by_tm/';
数据装载:
insert overwrite table ads_order_stats_by_tm
select * from ads_order_stats_by_tm
union
select
'2022-06-08' dt,
recent_days,
tm_id,
tm_name,
order_count,
order_user_count
from
(
select
1 recent_days,
tm_id,
tm_name,
sum(order_count_1d) order_count,
count(distinct(user_id)) order_user_count
from dws_trade_user_sku_order_1d
where dt='2022-06-08'
group by tm_id,tm_name
union all
select
recent_days,
tm_id,
tm_name,
sum(order_count),
count(distinct(if(order_count>0,user_id,null)))
from
(
select
recent_days,
user_id,
tm_id,
tm_name,
case recent_days
when 7 then order_count_7d
when 30 then order_count_30d
end order_count
from dws_trade_user_sku_order_nd lateral view explode(array(7,30)) tmp as recent_days
where dt='2022-06-08'
)t1
group by recent_days,tm_id,tm_name
)odr;
2. 各品类商品下单统计
需求说明:
|
统计周期 |
统计粒度 |
指标 |
说明 |
|
最近1、7、30日 |
品类 |
下单数 |
略 |
|
最近1、7、30日 |
品类 |
下单人数 |
略 |
3. 新增下单用户统计
需求说明:
|
统计周期 |
指标 |
说明 |
|
最近1、7、30日 |
新增下单人数 |
略 |
思路分析:
(1)首次下单日期在指定时间范围内即相应的新增下单用户。从dws_trade_user_order_td获取各用户的首次下单日期。

建表语句:
DROP TABLE IF EXISTS ads_new_order_user_stats;
CREATE EXTERNAL TABLE ads_new_order_user_stats
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
`new_order_user_count` BIGINT COMMENT '新增下单人数'
) COMMENT '新增下单用户统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_new_order_user_stats/';
装载语句:
insert overwrite table ads_new_order_user_stats
select * from ads_new_order_user_stats
union
select
'2022-06-08' dt,
recent_days,
count(*) new_order_user_count
from dws_trade_user_order_td lateral view explode(array(1,7,30)) tmp as recent_days
where dt='2022-06-08'
and order_date_first>=date_add('2022-06-08',-recent_days+1)
group by recent_days;
4.流量主题-各渠道流量统计:
使用炸裂函数:
建表语句:
DROP TABLE IF EXISTS ads_traffic_stats_by_channel;
CREATE EXTERNAL TABLE ads_traffic_stats_by_channel
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
`channel` STRING COMMENT '渠道',
`uv_count` BIGINT COMMENT '访客人数',
`avg_duration_sec` BIGINT COMMENT '会话平均停留时长,单位为秒',
`avg_page_count` BIGINT COMMENT '会话平均浏览页面数',
`sv_count` BIGINT COMMENT '会话数',
`bounce_rate` DECIMAL(16, 2) COMMENT '跳出率'
) COMMENT '各渠道流量统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_traffic_stats_by_channel/';
数据装载:

insert overwrite table ads_traffic_stats_by_channel
select * from ads_traffic_stats_by_channel
union
select
'2022-06-08' dt,
recent_days,
channel,
cast(count(distinct(mid_id)) as bigint) uv_count,
cast(avg(during_time_1d)/1000 as bigint) avg_duration_sec,
cast(avg(page_count_1d) as bigint) avg_page_count,
cast(count(*) as bigint) sv_count,
cast(sum(if(page_count_1d=1,1,0))/count(*) as decimal(16,2)) bounce_rate
from dws_traffic_session_page_view_1d lateral view explode(array(1,7,30)) tmp as recent_days
where dt>=date_add('2022-06-08',-recent_days+1)
group by recent_days,channel;
5.流量主题-路径分析:
建表语句:
DROP TABLE IF EXISTS ads_page_path;
CREATE EXTERNAL TABLE ads_page_path
(
`dt` STRING COMMENT '统计日期',
`source` STRING COMMENT '跳转起始页面ID',
`target` STRING COMMENT '跳转终到页面ID',
`path_count` BIGINT COMMENT '跳转次数'
) COMMENT '页面浏览路径分析'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_page_path/';
数据装载:
涉及到开窗函数:

insert overwrite table ads_page_path
select * from ads_page_path
union
select
'2022-06-08' dt,
source,
nvl(target,'null'),
count(*) path_count
from
(
select
concat('step-',rn,':',page_id) source,
concat('step-',rn+1,':',next_page_id) target
from
(
select
page_id,
lead(page_id,1,null) over(partition by session_id order by view_time) next_page_id,
row_number() over (partition by session_id order by view_time) rn
from dwd_traffic_page_view_inc
where dt='2022-06-08'
)t1
)t2
group by source,target;
6.用户主题-用户变动统计:
指标:
|
指标 |
说明 |
|
流失用户数 |
之前活跃过的用户,最近一段时间未活跃,就称为流失用户。此处要求统计7日前(只包含7日前当天)活跃,但最近7日未活跃的用户总数。 |
|
回流用户数 |
之前的活跃用户,一段时间未活跃(流失),今日又活跃了,就称为回流用户。此处要求统计回流用户总数。 |
建表语句:

DROP TABLE IF EXISTS ads_user_change;
CREATE EXTERNAL TABLE ads_user_change
(
`dt` STRING COMMENT '统计日期',
`user_churn_count` BIGINT COMMENT '流失用户数',
`user_back_count` BIGINT COMMENT '回流用户数'
) COMMENT '用户变动统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_user_change/';
数据装载:
insert overwrite table ads_user_change
select * from ads_user_change
union
select
churn.dt,
user_churn_count,
user_back_count
from
(
select
'2022-06-08' dt,
count(*) user_churn_count
from dws_user_user_login_td
where dt='2022-06-08'
and login_date_last=date_add('2022-06-08',-7)
)churn
join
(
select
'2022-06-08' dt,
count(*) user_back_count
from
(
select
user_id,
login_date_last
from dws_user_user_login_td
where dt='2022-06-08'
and login_date_last = '2022-06-08'
)t1
join
(
select
user_id,
login_date_last login_date_previous
from dws_user_user_login_td
where dt=date_add('2022-06-08',-1)
)t2
on t1.user_id=t2.user_id
where datediff(login_date_last,login_date_previous)>=8
)back
on churn.dt=back.dt;
7.用户主题-用户留存率:


建表语句:
DROP TABLE IF EXISTS ads_user_retention;
CREATE EXTERNAL TABLE ads_user_retention
(
`dt` STRING COMMENT '统计日期',
`create_date` STRING COMMENT '用户新增日期',
`retention_day` INT COMMENT '截至当前日期留存天数',
`retention_count` BIGINT COMMENT '留存用户数量',
`new_user_count` BIGINT COMMENT '新增用户数量',
`retention_rate` DECIMAL(16, 2) COMMENT '留存率'
) COMMENT '用户留存率'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_user_retention/';
数据装载:
insert overwrite table ads_user_retention
select * from ads_user_retention
union
select '2022-06-08' dt,
login_date_first create_date,
datediff('2022-06-08', login_date_first) retention_day,
sum(if(login_date_last = '2022-06-08', 1, 0)) retention_count,
count(*) new_user_count,
cast(sum(if(login_date_last = '2022-06-08', 1, 0)) / count(*) * 100 as decimal(16, 2)) retention_rate
from (
select user_id,
login_date_last,
login_date_first
from dws_user_user_login_td
where dt = '2022-06-08'
and login_date_first >= date_add('2022-06-08', -7)
and login_date_first < '2022-06-08'
) t1
group by login_date_first;
8.用户主题-用户新增活跃统计:
指标:
|
统计周期 |
指标 |
指标说明 |
|
最近1、7、30日 |
新增用户数 |
略 |
|
最近1、7、30日 |
活跃用户数 |
略 |
建表语句:
DROP TABLE IF EXISTS ads_user_stats;
CREATE EXTERNAL TABLE ads_user_stats
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近n日,1:最近1日,7:最近7日,30:最近30日',
`new_user_count` BIGINT COMMENT '新增用户数',
`active_user_count` BIGINT COMMENT '活跃用户数'
) COMMENT '用户新增活跃统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_user_stats/';
数据装载:
炸裂函数:
insert overwrite table ads_user_stats
select * from ads_user_stats
union
select '2022-06-08' dt,
recent_days,
sum(if(login_date_first >= date_add('2022-06-08', -recent_days + 1), 1, 0)) new_user_count,
count(*) active_user_count
from dws_user_user_login_td lateral view explode(array(1, 7, 30)) tmp as recent_days
where dt = '2022-06-08'
and login_date_last >= date_add('2022-06-08', -recent_days + 1)
group by recent_days;
9.用户主题-用户行为漏斗分析:
指标:
|
统计周期 |
指标 |
说明 |
|
最近1 日 |
首页浏览人数 |
略 |
|
最近1 日 |
商品详情页浏览人数 |
略 |
|
最近1 日 |
加购人数 |
略 |
|
最近1 日 |
下单人数 |
略 |
|
最近1 日 |
支付人数 |
支付成功人数 |
建表语句:
DROP TABLE IF EXISTS ads_user_action;
CREATE EXTERNAL TABLE ads_user_action
(
`dt` STRING COMMENT '统计日期',
`home_count` BIGINT COMMENT '浏览首页人数',
`good_detail_count` BIGINT COMMENT '浏览商品详情页人数',
`cart_count` BIGINT COMMENT '加购人数',
`order_count` BIGINT COMMENT '下单人数',
`payment_count` BIGINT COMMENT '支付人数'
) COMMENT '用户行为漏斗分析'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_user_action/';
数据装载:
insert overwrite table ads_user_action
select * from ads_user_action
union
select
'2022-06-08' dt,
home_count,
good_detail_count,
cart_count,
order_count,
payment_count
from
(
select
1 recent_days,
sum(if(page_id='home',1,0)) home_count,
sum(if(page_id='good_detail',1,0)) good_detail_count
from dws_traffic_page_visitor_page_view_1d
where dt='2022-06-08'
and page_id in ('home','good_detail')
)page
join
(
select
1 recent_days,
count(*) cart_count
from dws_trade_user_cart_add_1d
where dt='2022-06-08'
)cart
on page.recent_days=cart.recent_days
join
(
select
1 recent_days,
count(*) order_count
from dws_trade_user_order_1d
where dt='2022-06-08'
)ord
on page.recent_days=ord.recent_days
join
(
select
1 recent_days,
count(*) payment_count
from dws_trade_user_payment_1d
where dt='2022-06-08'
)pay
on page.recent_days=pay.recent_days;
10. 用户主题-最近7日内连续3日下单用户数

建表语句:
DROP TABLE IF EXISTS ads_order_continuously_user_count;
CREATE EXTERNAL TABLE ads_order_continuously_user_count
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,7:最近7天',
`order_continuously_user_count` BIGINT COMMENT '连续3日下单用户数'
) COMMENT '最近7日内连续3日下单用户数统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_order_continuously_user_count/';
数据装载:
select * from ads_order_continuously_user_count
union
select
'2022-06-08',
7,
count(distinct(user_id))
from
(
select
user_id,
datediff(lead(dt,2,'9999-12-31') over(partition by user_id order by dt),dt) diff
from dws_trade_user_order_1d
where dt>=date_add('2022-06-08',-6)
)t1
where diff=2;
11. 商品主题:各品牌商品下单统计:
指标:
|
统计周期 |
统计粒度 |
指标 |
说明 |
|
最近1、7、30日 |
品牌 |
下单数 |
略 |
|
最近1、7、30日 |
品牌 |
下单人数 |
略 |
建表语句:
DROP TABLE IF EXISTS ads_order_stats_by_tm;
CREATE EXTERNAL TABLE ads_order_stats_by_tm
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
`tm_id` STRING COMMENT '品牌ID',
`tm_name` STRING COMMENT '品牌名称',
`order_count` BIGINT COMMENT '下单数',
`order_user_count` BIGINT COMMENT '下单人数'
) COMMENT '各品牌商品下单统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_order_stats_by_tm/';
数据装载:


炸裂函数
insert overwrite table ads_order_stats_by_tm
select * from ads_order_stats_by_tm
union
select
'2022-06-08' dt,
recent_days,
tm_id,
tm_name,
order_count,
order_user_count
from
(
select
1 recent_days,
tm_id,
tm_name,
sum(order_count_1d) order_count,
count(distinct(user_id)) order_user_count
from dws_trade_user_sku_order_1d
where dt='2022-06-08'
group by tm_id,tm_name
union all
select
recent_days,
tm_id,
tm_name,
sum(order_count),
count(distinct(if(order_count>0,user_id,null)))
from
(
select
recent_days,
user_id,
tm_id,
tm_name,
case recent_days
when 7 then order_count_7d
when 30 then order_count_30d
end order_count
from dws_trade_user_sku_order_nd lateral view explode(array(7,30)) tmp as recent_days
where dt='2022-06-08'
)t1
group by recent_days,tm_id,tm_name
)odr;
12. 商品主题-各品类商品下单统计
和11的需求一样,同从一个表中获取,只不过一个是品牌,一个是品类。这也体现了我们设计DWS层这个表的优点,一个表中既有品牌又有品类,因此只需要根据不同的需求获取不同的指标。
13.商品主题-各品类商品购物车存量Top3

建表语句:
DROP TABLE IF EXISTS ads_sku_cart_num_top3_by_cate;
CREATE EXTERNAL TABLE ads_sku_cart_num_top3_by_cate
(
`dt` STRING COMMENT '统计日期',
`category1_id` STRING COMMENT '一级品类ID',
`category1_name` STRING COMMENT '一级品类名称',
`category2_id` STRING COMMENT '二级品类ID',
`category2_name` STRING COMMENT '二级品类名称',
`category3_id` STRING COMMENT '三级品类ID',
`category3_name` STRING COMMENT '三级品类名称',
`sku_id` STRING COMMENT 'SKU_ID',
`sku_name` STRING COMMENT 'SKU名称',
`cart_num` BIGINT COMMENT '购物车中商品数量',
`rk` BIGINT COMMENT '排名'
) COMMENT '各品类商品购物车存量Top3'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_sku_cart_num_top3_by_cate/';
数据装载:
-- 当数据中的Hash表结构为空时抛出类型转换异常,禁用相应优化即可
set hive.mapjoin.optimized.hashtable=false;
insert overwrite table ads_sku_cart_num_top3_by_cate
select * from ads_sku_cart_num_top3_by_cate
union
select
'2022-06-08' dt,
category1_id,
category1_name,
category2_id,
category2_name,
category3_id,
category3_name,
sku_id,
sku_name,
cart_num,
rk
from
(
select
sku_id,
sku_name,
category1_id,
category1_name,
category2_id,
category2_name,
category3_id,
category3_name,
cart_num,
rank() over (partition by category1_id,category2_id,category3_id order by cart_num desc) rk
from
(
select
sku_id,
sum(sku_num) cart_num
from dwd_trade_cart_full
where dt='2022-06-08'
group by sku_id
)cart
left join
(
select
id,
sku_name,
category1_id,
category1_name,
category2_id,
category2_name,
category3_id,
category3_name
from dim_sku_full
where dt='2022-06-08'
)sku
on cart.sku_id=sku.id
)t1
where rk<=3;
-- 优化项不应一直禁用,受影响的SQL执行完毕后打开
set hive.mapjoin.optimized.hashtable=true;
14.商品主题-各品牌商品收藏次数Top3:

15.支付主题-下单到支付时间间隔平均值:
建表语句:
DROP TABLE IF EXISTS ads_order_to_pay_interval_avg;
CREATE EXTERNAL TABLE ads_order_to_pay_interval_avg
(
`dt` STRING COMMENT '统计日期',
`order_to_pay_interval_avg` BIGINT COMMENT '下单到支付时间间隔平均值,单位为秒'
) COMMENT '下单到支付时间间隔平均值统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_order_to_pay_interval_avg/';
数据装载:
使用累计快照事实表

insert overwrite table ads_order_to_pay_interval_avg
select * from ads_order_to_pay_interval_avg
union
select
'2022-06-08',
cast(avg(to_unix_timestamp(payment_time)-to_unix_timestamp(order_time)) as bigint)
from dwd_trade_trade_flow_acc
where dt in ('9999-12-31','2022-06-08')
and payment_date_id='2022-06-08';
16.支付主题-各省份交易统计:
指标:
|
统计周期 |
统计粒度 |
指标 |
说明 |
|
最近1、7、30日 |
省份 |
订单数 |
略 |
|
最近1、7、30日 |
省份 |
订单金额 |
略 |
建表语句:
DROP TABLE IF EXISTS ads_order_by_province;
CREATE EXTERNAL TABLE ads_order_by_province
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',
`province_id` STRING COMMENT '省份ID',
`province_name` STRING COMMENT '省份名称',
`area_code` STRING COMMENT '地区编码',
`iso_code` STRING COMMENT '旧版国际标准地区编码,供可视化使用',
`iso_code_3166_2` STRING COMMENT '新版国际标准地区编码,供可视化使用',
`order_count` BIGINT COMMENT '订单数',
`order_total_amount` DECIMAL(16, 2) COMMENT '订单金额'
) COMMENT '各省份交易统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_order_by_province/';
数据装载:
insert overwrite table ads_order_by_province
select * from ads_order_by_province
union
select
'2022-06-08' dt,
1 recent_days,
province_id,
province_name,
area_code,
iso_code,
iso_3166_2,
order_count_1d,
order_total_amount_1d
from dws_trade_province_order_1d
where dt='2022-06-08'
union
select
'2022-06-08' dt,
recent_days,
province_id,
province_name,
area_code,
iso_code,
iso_3166_2,
case recent_days
when 7 then order_count_7d
when 30 then order_count_30d
end order_count,
case recent_days
when 7 then order_total_amount_7d
when 30 then order_total_amount_30d
end order_total_amount
from dws_trade_province_order_nd lateral view explode(array(7,30)) tmp as recent_days
where dt='2022-06-08';
更多推荐



所有评论(0)