数仓项目02:DWD明细粒度事实层

2. 第二层DW主题层

2.1 DWD明细层

2.1.1 用户主题

DWD明细粒度事实层Hive数据库建库建表:
创建Hive库并进入:
create database if not exists dwd_nshop;
use dwd_nshop;

在DWD层开始入库之前,我们有一张通用字典表,在mysql已经导入,为后面的数据筛选做条件过滤:


2.1.1.1 用户启动日志表【DWD】
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_actlog_launch (
user_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
launch_time_segment string COMMENT '启动时间段',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dw/user/dwd_nshop_actlog_launch/';

从ods层事件表里选择action=02(启动)的事件数据导入即可:

insert overwrite table dwd_nshop.dwd_nshop_actlog_launch partition(bdp_day="20200618")
select
customer_id,
device_num,
device_type,
os,
os_version,
manufacturer,
carrier,
network_type,
area_code,
from_unixtime(cast(ct/1000 as int),'HH') as launch_time_segment,
ct
from
ods_nshop.ods_nshop_01_useractlog
where
bdp_day = "20200618"
and 
action = "02"
2.1.1.2 用户产品浏览表【DWD】
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_actlog_pdtview (
user_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
target_id string COMMENT '产品ID',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dw/user/dwd_nshop_actlog_pdtview/'

从ods层的事件表里筛选出action为07或08的数据,即为用户浏览数据:

insert overwrite table dwd_nshop.dwd_nshop_actlog_pdtview partition(bdp_day="20200618")
select
customer_id,
device_num,
device_type,
os,
os_version,
manufacturer,
carrier,
network_type,
area_code,
get_json_object(extinfo,'$.target_id')as target_id,
ct
from
ods_nshop.ods_nshop_01_useractlog
where
bdp_day = "20200618"
and 
action in('07','08')
2.1.1.3 用户产品查询表【DWD】
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_actlog_pdtsearch (
user_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
target_order string COMMENT '查询排序方式',
target_keys string COMMENT '查询内容',
target_id string COMMENT '产品ID',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dw/user/dwd_nshop_actlog_pdtsearch/';

查看公共字典表:




我们知道,选择action为05(交互)和event_type为01(浏览)或04(滑动)的行为是用户查询行为,因此写出下列sql语句

insert overwrite table dwd_nshop.dwd_nshop_actlog_pdtsearch partition(bdp_day="20200618")
select
customer_id,
device_num,
device_type,
os,
os_version,
manufacturer,
carrier,
network_type,
area_code,
get_json_object(extinfo,'$.target_order')as target_order,
get_json_object(extinfo,'$.target_keys')as target_keys,
get_json_object(extinfo,'$.target_id')as target_id,
ct
from
ods_nshop.ods_nshop_01_useractlog
--lateral view explode(split(regexp_replace(get_json_object(extinfo,'$target_ids'),'[\\[\\"\\]]',''),','))t as target_id
where
bdp_day = "20200618"
and 
action = '05'
and
event_type in('01','04') 
2.1.1.4 用户产品关注表【DWD】
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_actlog_product_comment (
user_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
target_id string COMMENT '产品ID',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dw/user/dwd_actlog_product_comment/';

选择action ='05'(交互),event_type='02'(点击),并且target_action='01'(店铺关注)的事件即可:

with log_attend as(
select
customer_id,
device_num,
device_type,
os,
os_version,
manufacturer,
carrier,
network_type,
area_code,
get_json_object(extinfo,'$.target_action')as target_action,
get_json_object(extinfo,'$.target_id')as target_id,
extinfo,
ct,
bdp_day
from
ods_nshop.ods_nshop_01_useractlog
where
bdp_day = "20200618"
and 
action ='05'
and 
event_type='02'
)

insert overwrite table dwd_nshop.dwd_actlog_product_comment partition(bdp_day="20200618")
select
customer_id,
device_num,
device_type,
os,
os_version,
manufacturer,
carrier,
network_type,
area_code,
target_id,
ct
from 
log_attend where target_action='01'
2.1.2 交易主题
2.1.2.1 交易订单明细流水表【DWD】
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_orders_details (
order_id string COMMENT '订单ID',
order_status INT COMMENT '订单状态:5已收货(完成)|6投诉 7退货',
supplier_code string COMMENT '店铺ID',
product_code string COMMENT '商品ID',
customer_id string COMMENT '用户id',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
user_areacode string COMMENT '用户所在地区',
consignee_zipcode string COMMENT '收货人地址',
pay_type string COMMENT '支付类型:线上支付 10 网上银行 11 微信 12 支付宝 | 线下支 付(货到付款) 20 ',
pay_count INT COMMENT '支付次数',
product_price DECIMAL (5, 1) COMMENT '购买商品单价',
weighing_cost DECIMAL (2, 1) COMMENT '商品加权价格',
district_money DECIMAL (4, 1) COMMENT '优惠金额',
is_activity int COMMENT '1:参加活动|0:没有参加活动',
order_ctime BIGINT COMMENT '创建时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dwd/order/dwd_nshop_orders_details/';

订单明细流水表的数据主要是从ods层的订单详细表里抽取,结合公共产品维度表查出产品相关信息,另外还结合订单支付记录表的数据,查出支付相关信息,sql语句如下:

with tborder as(
  select
    order_id,
    order_status,
    customer_id,
    consignee_zipcode,
    pay_type,
    order_ctime,
    from_unixtime(cast(order_ctime/1000 as bigint),'yyyyMMdd') as bdp_day
  from ods_nshop.ods_02_orders
  where 
    from_unixtime(cast(order_ctime/1000 as bigint),'yyyyMMdd') = '20200618'
),
tbdetail as(
  select 
    a.order_id,
    a.product_id,
    a.product_cnt,
    a.weighing_cost,
    a.district_money,
    a.is_activity,
    b.supplier_code,
    b.product_price,
    from_unixtime(cast(a.order_detail_ctime/1000 as bigint),'yyyyMMdd') as bdp_day
  from ods_nshop.ods_02_order_detail a
  join ods_nshop.dim_pub_product b 
  on a.product_id=b.product_code 
  where   
from_unixtime(cast(a.order_detail_ctime/1000 as bigint),'yyyyMMdd')='20200618'
),
pays as (
    select 
        count(*) as pay_count,
        order_id,
        from_unixtime(cast(pay_ctime/1000 as bigint),'yyyyMMdd') as bdp_day
    from  ods_nshop.ods_02_orders_pay_records 
    where 
       from_unixtime(cast(pay_ctime/1000 as bigint),'yyyyMMdd')='20200618'
    group by 
     order_id,
    from_unixtime(cast(pay_ctime/1000 as bigint),'yyyyMMdd')
)
insert overwrite table dwd_nshop.dwd_nshop_orders_details partition (bdp_day)
select 
    tborder.order_id,
    tborder.order_status,
    tbdetail.supplier_code,
    tbdetail.product_id,
    tborder.customer_id,
    tborder.consignee_zipcode,
    tborder.pay_type,
    pays.pay_count,
    tbdetail.product_price,
    tbdetail.product_cnt,
    tbdetail.weighing_cost,
    tbdetail.district_money,
    tbdetail.is_activity,
    tborder.order_ctime,
    tborder.bdp_day
from tborder join tbdetail 
on tborder.order_id=tbdetail.order_id
join pays 
on tbdetail.order_id=pays.order_id

2.2.1 订单支付表【DWD】

CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_order_pay (
pay_id string COMMENT '订单支付记录ID',
order_id string COMMENT '订单ID',
customer_id string COMMENT '用户ID',
user_id string COMMENT '用户id',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
longitude string COMMENT '经度',
latitude string COMMENT '纬度',
page_id string COMMENT '行为所在页',
target_action string COMMENT '参考点击目标类型说明',
target_id string COMMENT '订单id',
target_price DOUBLE COMMENT '订单价格',
target_status string COMMENT '支付状态:0 未支付| 1 支付中 | 2 已支付',
target_type string COMMENT '支付类型:线上支付 10 网上银行 11 微信 12 支付宝 | 线 下支付(货到付款) 20 ',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dwd/order/dwd_order_pay/'
2.1.3 营销活动主题

广告投放数据表【DWD】

CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_releasedatas (
customer_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
area_code string COMMENT '地区编码',
release_sid string COMMENT '投放请求id',
release_ip string COMMENT '投放方ip',
release_session string COMMENT '投放会话id',
release_sources string COMMENT '投放渠道',
release_category string COMMENT '投放浏览产品分类',
release_product string COMMENT '投放浏览产品',
release_product_page string COMMENT '投放浏览产品页',
ct BIGINT COMMENT '创建时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dwd/release/dwd_nshop_releasedatas/'

这里需要关联两张中间表,一个是产品表,查出产品分类,一个是页面布局表,选择产品页,两张表结构如下:


页面布局表

插入数据:

with tbrelease as(
select
c.customer_id,
r.device_num ,
r.device_type ,
r.os , 
r.os_version ,
r.manufacturer ,
r.area_code ,
r.release_sid ,
parse_url(concat("http://127.0.0.1:8088/release?",'',r.release_params),'QUERY','ip')as release_ip,
r.release_session,
r.release_sources,   
parse_url(concat("http://127.0.0.1:8088/release?",'',r.release_params),'QUERY','productPage')as release_product_page,
r.ct
from ods_nshop.ods_01_releasedatas r
join ods_nshop.ods_02_customer c
on r.customer_id=c.customer_id 
where 
bdp_day='20200618'
)
insert overwrite table dwd_nshop.dwd_nshop_releasedatas partition(bdp_day='20200618')
select 
a.customer_id,
a.device_num ,
a.device_type ,
a.os , 
a.os_version ,
a.manufacturer, 
a.area_code ,
a.release_sid ,
a.release_ip,
a.release_session,
a.release_sources, 
f.category_code release_category,
p.page_target release_product,
a.release_product_page,
a.ct
from tbrelease a
join dim_nshop.dim_pub_page p 
on a.release_product_page=p.page_code and p.page_type='4'
join dim_nshop.dim_pub_product f
on p.page_code=f.product_code;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容