离线数仓(十)【ADS 层开发】(4)https://developer.aliyun.com/article/1532453
1.4、交易主题
1.4.1、交易综合统计
需求:
统计周期 |
指标 |
最近1、7、30日 |
订单总额 |
最近1、7、30日 |
订单数 |
最近1、7、30日 |
订单人数 |
最近1、7、30日 |
退单数 |
最近1、7、30日 |
退单人数 |
建表语句
DROP TABLE IF EXISTS ads_trade_stats; CREATE EXTERNAL TABLE ads_trade_stats ( `dt` STRING COMMENT '统计日期', `recent_days` BIGINT COMMENT '最近天数,1:最近1日,7:最近7天,30:最近30天', `order_total_amount` DECIMAL(16, 2) COMMENT '订单总额,GMV', `order_count` BIGINT COMMENT '订单数', `order_user_count` BIGINT COMMENT '下单人数', `order_refund_count` BIGINT COMMENT '退单数', `order_refund_user_count` BIGINT COMMENT '退单人数' ) COMMENT '交易统计' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/warehouse/gmall/ads/ads_trade_stats/';
数据装载
insert overwrite table ads_trade_stats select * from ads_trade_stats union select '2020-06-14', odr.recent_days, order_total_amount, order_count, order_user_count, order_refund_count, order_refund_user_count from ( select 1 recent_days, sum(order_total_amount_1d) order_total_amount, sum(order_count_1d) order_count, count(*) order_user_count from dws_trade_user_order_1d where dt='2020-06-14' union all select recent_days, sum(order_total_amount), sum(order_count), sum(if(order_count>0,1,0)) from ( select recent_days, case recent_days when 7 then order_total_amount_7d when 30 then order_total_amount_30d end order_total_amount, case recent_days when 7 then order_count_7d when 30 then order_count_30d end order_count from dws_trade_user_order_nd lateral view explode(array(7,30)) tmp as recent_days where dt='2020-06-14' )t1 group by recent_days )odr join ( select 1 recent_days, sum(order_refund_count_1d) order_refund_count, count(*) order_refund_user_count from dws_trade_user_order_refund_1d where dt='2020-06-14' union all select recent_days, sum(order_refund_count), sum(if(order_refund_count>0,1,0)) from ( select recent_days, case recent_days when 7 then order_refund_count_7d when 30 then order_refund_count_30d end order_refund_count from dws_trade_user_order_refund_nd lateral view explode(array(7,30)) tmp as recent_days where dt='2020-06-14' )t1 group by recent_days )refund on odr.recent_days=refund.recent_days;
1.4.2、各省份交易统计
需求:
统计周期 |
统计粒度 |
指标 |
最近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 '2020-06-14' 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='2020-06-14' union select '2020-06-14' dt, recent_days, province_id, province_name, area_code, iso_code, iso_3166_2, sum(order_count), sum(order_total_amount) from ( select 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='2020-06-14' )t1 group by recent_days,province_id,province_name,area_code,iso_code,iso_3166_2;
1.5、优惠券主题
1.5.1、最近30天发布的优惠券的补贴率
需求:
统计粒度 |
指标 |
说明 |
优惠券 |
补贴率 |
用券的订单明细优惠券减免金额总和/原始金额总和 |
建表语句
DROP TABLE IF EXISTS ads_coupon_stats; CREATE EXTERNAL TABLE ads_coupon_stats ( `dt` STRING COMMENT '统计日期', `coupon_id` STRING COMMENT '优惠券ID', `coupon_name` STRING COMMENT '优惠券名称', `start_date` STRING COMMENT '发布日期', `rule_name` STRING COMMENT '优惠规则,例如满100元减10元', `reduce_rate` DECIMAL(16, 2) COMMENT '补贴率' ) COMMENT '优惠券统计' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/warehouse/gmall/ads/ads_coupon_stats/';
数据装载
insert overwrite table ads_coupon_stats select * from ads_coupon_stats union select '2020-06-14' dt, coupon_id, coupon_name, start_date, coupon_rule, cast(coupon_reduce_amount_30d/original_amount_30d as decimal(16,2)) from dws_trade_coupon_order_nd where dt='2020-06-14';
1.6、活动主题
1.6.1、最近30天发布的活动的补贴率
需求:
统计粒度 |
指标 |
说明 |
活动 |
补贴率 |
参与促销活动的订单明细活动减免金额总和/原始金额总和 |
建表语句
DROP TABLE IF EXISTS ads_activity_stats; CREATE EXTERNAL TABLE ads_activity_stats ( `dt` STRING COMMENT '统计日期', `activity_id` STRING COMMENT '活动ID', `activity_name` STRING COMMENT '活动名称', `start_date` STRING COMMENT '活动开始日期', `reduce_rate` DECIMAL(16, 2) COMMENT '补贴率' ) COMMENT '活动统计' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/warehouse/gmall/ads/ads_activity_stats/';
数据装载
insert overwrite table ads_activity_stats select * from ads_activity_stats union select '2020-06-14' dt, activity_id, activity_name, start_date, cast(activity_reduce_amount_30d/original_amount_30d as decimal(16,2)) from dws_trade_activity_order_nd where dt='2020-06-14';
总结
至此,ADS 层搭建完毕,这些 SQL 必须熟练的写出来,前提就是对项目结构特别熟悉,尤其是用到的业务表以及通过用户行为日志解析出来的表。其余就是一些函数的练习,常用的 炸裂函数、排名函数、窗口函数等。