标签:定义 tab 每日 tail 年龄 lse 表示 输入 表数
分析:
完成品牌复购率需要建立一个宽表,宽表里面包括用户信息,商品信息,以及此商品购买的个数,即一个订单,根据订单里面的商品id不同,可能有多条这样的宽表记录。
有了宽表后,再做相应的统计工作。
一 用户购买商品明细表(宽表)
建表语句:
订单详情表数据量较大,采用分区表。
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 ‘用户等级‘, order_price decimal(10,2) comment ‘商品价格‘, sku_name string comment ‘商品名称‘, sku_tm_id string comment ‘品牌id‘, sku_category3_id string comment ‘商品三级品类id‘, sku_category2_id string comment ‘商品二级品类id‘, sku_category1_id string comment ‘商品一级品类id‘, sku_category3_name string comment ‘商品三级品类名称‘, sku_category2_name string comment ‘商品二级品类名称‘, sku_category1_name string comment ‘商品一级品类名称‘, spu_id string comment ‘商品 spu‘, sku_num int comment ‘购买个数‘, order_count string comment ‘当日下单单数‘, order_amount string comment ‘当日下单金额‘ ) COMMENT ‘用户购买商品明细表‘ PARTITIONED BY (`dt` string) stored as parquet location ‘/warehouse/gmall/dws/dws_user_sale_detail_daycount/‘ tblproperties ("parquet.compression"="snappy");
数据导入脚本:
①如上分析,这张宽表数据分为3部分,一是用户信息,来自DWD层用户表;二是商品信息表,来自DWD层降维后的商品表;三是此商品的用户购买信息,包括购买的几个,总计多少钱,来自DWD层订单详情表。
②在订单详情表加限制条件where od.dt=‘$do_date‘是因为只统计昨天的数据。
③在商品和用户表的连接加限制条件u.dt=‘$do_date‘是因为商品和用户是采取每日增量导入,昨天的才是最新的数据。
④每个用户,根据商品id,可能有多条记录,在sql上的体现为group by user_id, sku_id。
⑤临时表中count(*) order_count, 表示昨天这个用户购买这个商品的订单有几个,即购买了几次。
#!/bin/bash # 定义变量方便修改 APP=gmall hive=/opt/module/hive/bin/hive # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 if [ -n "$1" ] ;then do_date=$1 else do_date=`date -d "-1 day" +%F` fi 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=‘$do_date‘ group by user_id, sku_id ) insert overwrite table "$APP".dws_sale_detail_daycount partition(dt=‘$do_date‘) select tmp_detail.user_id, tmp_detail.sku_id, u.gender, months_between(‘$do_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 tmp_detail.user_id=u.id and u.dt=‘$do_date‘ left join "$APP".dwd_sku_info s on tmp_detail.sku_id =s.id and s.dt=‘$do_date‘; " $hive -e "$sql"
标签:定义 tab 每日 tail 年龄 lse 表示 输入 表数
原文地址:https://www.cnblogs.com/noyouth/p/13226150.html