百問(wèn)中臺(tái):數(shù)據(jù)中臺(tái)ODDA之DWS層建模

概述

DWD完成后术幔,接下來(lái)就是進(jìn)行DWS建模。將具有相同分析主題的DWD層數(shù)據(jù)梯影,聚合層寬表模型嘶朱,便于數(shù)據(jù)分析和計(jì)算。

ODDA建模

DWS模型

從訂單表光酣、用戶表和支付流水表疏遏,用戶行為表
從訂單表、訂單詳情表救军、商品表财异、用戶表和支付流水表,用戶購(gòu)買商品明細(xì)表

1. 建表

-- 進(jìn)入數(shù)據(jù)庫(kù)
use mall;

-- 創(chuàng)建用戶行為寬表
drop table if exists dws_user_action;
create  external table dws_user_action
(
    user_id         string      comment '用戶 id',
    order_count     bigint      comment '下單次數(shù) ',
    order_amount    decimal(16,2)  comment '下單金額 ',
    payment_count   bigint      comment '支付次數(shù)',
    payment_amount  decimal(16,2) comment '支付金額 '
) COMMENT '每日用戶行為寬表'
PARTITIONED BY ( `dt` string)
stored as  parquet
location '/warehouse/mall/dws/dws_user_action/'
tblproperties ("parquet.compression"="snappy");

-- 創(chuàng)建用戶購(gòu)買商品明細(xì)表
drop table if exists  dws_sale_detail_daycount;
create external table  dws_sale_detail_daycount
(   user_id   string  comment '用戶 id',
    sku_id    string comment '商品 Id',
    user_gender  string comment '用戶性別',
    user_age string  comment '用戶年齡',
    user_level string comment '用戶等級(jí)',
    order_price decimal(10,2) comment '訂單價(jià)格',
    sku_name string   comment '商品名稱',
    sku_tm_id string   comment '品牌id',
    sku_category3_id string comment '商品三級(jí)品類id',
    sku_category2_id string comment '商品二級(jí)品類id',
    sku_category1_id string comment '商品一級(jí)品類id',
    sku_category3_name string comment '商品三級(jí)品類名稱',
    sku_category2_name string comment '商品二級(jí)品類名稱',
    sku_category1_name string comment '商品一級(jí)品類名稱',
    spu_id  string comment '商品 spu',
    sku_num  int comment '購(gòu)買個(gè)數(shù)',
    order_count string comment '當(dāng)日下單單數(shù)',
    order_amount string comment '當(dāng)日下單金額'
) COMMENT '用戶購(gòu)買商品明細(xì)表'
PARTITIONED BY ( `dt` string)
stored as  parquet
location '/warehouse/mall/dws/dws_user_sale_detail_daycount/'
tblproperties ("parquet.compression"="snappy");

執(zhí)行建表語(yǔ)句:

hive -f /home/warehouse/sql/dws_ddl.sql

2. 腳本

#!/bin/bash

# 定義變量方便修改
APP=mall
hive=hive

# 如果是輸入的日期按照取輸入日期唱遭;如果沒(méi)輸入日期取當(dāng)前時(shí)間的前一天
if [ -n $1 ] ;then
        log_date=$1
else 
        log_date=`date  -d "-1 day"  +%F`  
fi 

# 用戶行為寬表
function user_actions()
{
    # 定義變量
    APP=$1
    hive=$2
    log_date=$3

    sql="
    
    with  
    tmp_order as
    (
        select 
        user_id, 
        sum(oc.total_amount) order_amount, 
        count(*)  order_count
        from "$APP".dwd_order_info  oc
        where date_format(oc.create_time,'yyyy-MM-dd')='$log_date'
        group by user_id
    ),
    tmp_payment as
    (
        select 
        user_id, 
        sum(pi.total_amount) payment_amount, 
        count(*) payment_count 
        from "$APP".dwd_payment_info pi 
        where date_format(pi.payment_time,'yyyy-MM-dd')='$log_date'
        group by user_id
    )

    insert  overwrite table "$APP".dws_user_action partition(dt='$log_date')
    select 
        user_actions.user_id, 
        sum(user_actions.order_count), 
        sum(user_actions.order_amount),
        sum(user_actions.payment_count), 
        sum(user_actions.payment_amount)
    from 
    (
        select 
        user_id, 
        order_count,
        order_amount ,
        0 payment_count , 
        0 payment_amount
        from tmp_order 

        union all
        select 
        user_id, 
        0,
        0, 
        payment_count, 
        payment_amount
        from tmp_payment
    ) user_actions
    group by user_id;

    "

    $hive -e "$sql"
}

function user_sales()
{
    # 定義變量
    APP=$1
    hive=$2
    log_date=$3

    sql="

    set hive.exec.dynamic.partition.mode=nonstrict;

    with
    tmp_detail as
    (
        select 
            user_id,
            sku_id, 
            sum(sku_num) sku_num ,   
            count(*) order_count , 
            sum(od.order_price*sku_num)  order_amount 
        from "$APP".dwd_order_detail od
        where od.dt='$log_date' and user_id is not null
        group by user_id, sku_id
    )  
    insert overwrite table  "$APP".dws_sale_detail_daycount partition(dt='$log_date')
    select 
        tmp_detail.user_id,
        tmp_detail.sku_id,
        u.gender,
        months_between('$log_date', u.birthday)/12  age, 
        u.user_level,
        price,
        sku_name,
        tm_id,
        category3_id ,  
        category2_id ,  
        category1_id ,  
        category3_name ,  
        category2_name ,  
        category1_name ,  
        spu_id,
        tmp_detail.sku_num,
        tmp_detail.order_count,
        tmp_detail.order_amount 
    from tmp_detail 
    left join "$APP".dwd_user_info u 
    on u.id=tmp_detail.user_id  and u.dt='$log_date'
    left join "$APP".dwd_sku_info s on tmp_detail.sku_id =s.id  and s.dt='$log_date';

    "
    $hive -e "$sql"
}

user_actions $APP $hive $log_date

3. 結(jié)果

hive> select * from dws_user_action limit 2;
OK
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
1       1       402     0       0       2021-03-24
10      1       205     1       205     2021-03-24
Time taken: 0.843 seconds, Fetched: 2 row(s)
hive> select * from dws_sale_detail_daycount limit 2;
OK
1       135     NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    2       1       8958.0  2021-03-24
1       141     NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    1       1       571.0   2021-03-24
Time taken: 0.119 seconds, Fetched: 2 row(s)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戳寸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拷泽,更是在濱河造成了極大的恐慌疫鹊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件司致,死亡現(xiàn)場(chǎng)離奇詭異拆吆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脂矫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門枣耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人庭再,你說(shuō)我怎么就攤上這事捞奕。” “怎么了拄轻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵颅围,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我恨搓,道長(zhǎng)院促,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮一疯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夺姑。我一直安慰自己墩邀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布盏浙。 她就那樣靜靜地躺著眉睹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪废膘。 梳的紋絲不亂的頭發(fā)上竹海,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音丐黄,去河邊找鬼斋配。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灌闺,可吹牛的內(nèi)容都是我干的艰争。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼桂对,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甩卓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蕉斜,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逾柿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宅此,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體机错,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年父腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毡熏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侣诵,死狀恐怖痢法,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杜顺,我是刑警寧澤财搁,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站躬络,受9級(jí)特大地震影響尖奔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一提茁、第九天 我趴在偏房一處隱蔽的房頂上張望淹禾。 院中可真熱鬧,春花似錦茴扁、人聲如沸铃岔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁习。三九已至,卻和暖如春卖丸,著一層夾襖步出監(jiān)牢的瞬間纺且,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工稍浆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留载碌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓衅枫,卻偏偏與公主長(zhǎng)得像恐仑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子为鳄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容