五、数据仓库电商项目——DWT层、可与DWS合并一层

DWT层 

DWT层将DWS层每日聚合的数据进行积累,DWT层不是分区表,是一个累积型全量表,并且数据来源与DWS层。

累积性全量表:查询要改动的旧数据,查询新增和变化的新数据,新旧关联,以新换旧,导入覆盖。

DWT设备主题宽表

在这里插入图片描述

用户主题宽表

 

drop table if exists dwt_user_topic;
create external table dwt_user_topic
(
    user_id string  comment '用户id',
    login_date_first string  comment '首次登录时间',
    login_date_last string  comment '末次登录时间',
    login_count bigint comment '累积登录天数',
    login_last_30d_count bigint comment '最近30日登录天数',
    order_date_first string  comment '首次下单时间',
    order_date_last string  comment '末次下单时间',
    order_count bigint comment '累积下单次数',
    order_amount decimal(16,2) comment '累积下单金额',
    order_last_30d_count bigint comment '最近30日下单次数',
    order_last_30d_amount bigint comment '最近30日下单金额',
    payment_date_first string  comment '首次支付时间',
    payment_date_last string  comment '末次支付时间',
    payment_count decimal(16,2) comment '累积支付次数',
    payment_amount decimal(16,2) comment '累积支付金额',
    payment_last_30d_count decimal(16,2) comment '最近30日支付次数',
    payment_last_30d_amount decimal(16,2) comment '最近30日支付金额'
 )COMMENT '用户主题宽表'
stored as parquet
location '/warehouse/gmall/dwt/dwt_user_topic/'
tblproperties ("parquet.compression"="lzo");



 insert overwrite table dwt_user_topic
select
    nvl(new.user_id,old.user_id),
    if(old.login_date_first is null and new.login_count>0,'2020-03-29',old.login_date_first),
    if(new.login_count>0,'2020-03-29',old.login_date_last),
    nvl(old.login_count,0)+if(new.login_count>0,1,0),
    nvl(new.login_last_30d_count,0),
    if(old.order_date_first is null and new.order_count>0,'2020-03-29',old.order_date_first),
    if(new.order_count>0,'2020-03-29',old.order_date_last),
    nvl(old.order_count,0)+nvl(new.order_count,0),
    nvl(old.order_amount,0)+nvl(new.order_amount,0),
    nvl(new.order_last_30d_count,0),
    nvl(new.order_last_30d_amount,0),
    if(old.payment_date_first is null and new.payment_count>0,'2020-03-29',old.payment_date_first),
    if(new.payment_count>0,'2020-03-29',old.payment_date_last),
    nvl(old.payment_count,0)+nvl(new.payment_count,0),
    nvl(old.payment_amount,0)+nvl(new.payment_amount,0),
    nvl(new.payment_last_30d_count,0),
    nvl(new.payment_last_30d_amount,0)
from
dwt_user_topic old
full outer join
(
    select
        user_id,
        sum(if(dt='2020-03-29',login_count,0)) login_count,
        sum(if(dt='2020-03-29',order_count,0)) order_count,
        sum(if(dt='2020-03-29',order_amount,0)) order_amount,
        sum(if(dt='2020-03-29',payment_count,0)) payment_count,
        sum(if(dt='2020-03-29',payment_amount,0)) payment_amount,
        sum(if(login_count>0,1,0)) login_last_30d_count,
        sum(order_count) order_last_30d_count,
        sum(order_amount) order_last_30d_amount,
        sum(payment_count) payment_last_30d_count,
        sum(payment_amount) payment_last_30d_amount
    from dws_user_action_daycount
    where dt>=date_add( '2020-03-29',-30)
    group by user_id
)new
on old.user_id=new.user_id;

商品主题宽表

hive (gmall)> 
drop table if exists dwt_sku_topic;
create external table dwt_sku_topic
(
    sku_id string comment 'sku_id',`在这里插入代码片`
    spu_id string comment 'spu_id',
    order_last_30d_count bigint comment '最近30日被下单次数',
    order_last_30d_num bigint comment '最近30日被下单件数',
    order_last_30d_amount decimal(16,2)  comment '最近30日被下单金额',
    order_count bigint comment '累积被下单次数',
    order_num bigint comment '累积被下单件数',
    order_amount decimal(16,2) comment '累积被下单金额',
    payment_last_30d_count   bigint  comment '最近30日被支付次数',
    payment_last_30d_num bigint comment '最近30日被支付件数',
    payment_last_30d_amount  decimal(16,2) comment '最近30日被支付金额',
    payment_count   bigint  comment '累积被支付次数',
    payment_num bigint comment '累积被支付件数',
    payment_amount  decimal(16,2) comment '累积被支付金额',
    refund_last_30d_count bigint comment '最近三十日退款次数',
    refund_last_30d_num bigint comment '最近三十日退款件数',
    refund_last_30d_amount decimal(10,2) comment '最近三十日退款金额',
    refund_count bigint comment '累积退款次数',
    refund_num bigint comment '累积退款件数',
    refund_amount decimal(10,2) comment '累积退款金额',
    cart_last_30d_count bigint comment '最近30日被加入购物车次数',
    cart_last_30d_num bigint comment '最近30日被加入购物车件数',
    cart_count bigint comment '累积被加入购物车次数',
    cart_num bigint comment '累积被加入购物车件数',
    favor_last_30d_count bigint comment '最近30日被收藏次数',
    favor_count bigint comment '累积被收藏次数',
    appraise_last_30d_good_count bigint comment '最近30日好评数',
    appraise_last_30d_mid_count bigint comment '最近30日中评数',
    appraise_last_30d_bad_count bigint comment '最近30日差评数',
    appraise_last_30d_default_count bigint comment '最近30日默认评价数',
    appraise_good_count bigint comment '累积好评数',
    appraise_mid_count bigint comment '累积中评数',
    appraise_bad_count bigint comment '累积差评数',
    appraise_default_count bigint comment '累积默认评价数'
 )COMMENT '商品主题宽表'
stored as parquet
location '/warehouse/gmall/dwt/dwt_sku_topic/'
tblproperties ("parquet.compression"="lzo");
INSERT OVERWRITE INTO dwt_sku_topic
SELECT nvl(new.sku_id, old.sku_id), dwd_dim_sku_info.spu_id
	, nvl(new.order_count30, 0)
	, nvl(new.order_num30, 0)
	, nvl(new.order_amount30, 0)
	, nvl(old.order_count, 0) + nvl(new.order_count, 0)
	, nvl(old.order_num, 0) + nvl(new.order_num, 0)
	, nvl(old.order_amount, 0) + nvl(new.order_amount, 0)
	, nvl(new.payment_count30, 0)
	, nvl(new.payment_num30, 0)
	, nvl(new.payment_amount30, 0)
	, nvl(old.payment_count, 0) + nvl(new.payment_count, 0)
	, nvl(old.payment_num, 0) + nvl(new.payment_count, 0)
	, nvl(old.payment_amount, 0) + nvl(new.payment_count, 0)
	, nvl(new.refund_count30, 0)
	, nvl(new.refund_num30, 0)
	, nvl(new.refund_amount30, 0)
	, nvl(old.refund_count, 0) + nvl(new.refund_count, 0)
	, nvl(old.refund_num, 0) + nvl(new.refund_num, 0)
	, nvl(old.refund_amount, 0) + nvl(new.refund_amount, 0)
	, nvl(new.cart_count30, 0)
	, nvl(new.cart_num30, 0)
	, nvl(old.cart_count, 0) + nvl(new.cart_count, 0)
	, nvl(old.cart_num, 0) + nvl(new.cart_num, 0)
	, nvl(new.favor_count30, 0)
	, nvl(old.favor_count, 0) + nvl(new.favor_count, 0)
	, nvl(new.appraise_good_count30, 0)
	, nvl(new.appraise_mid_count30, 0)
	, nvl(new.appraise_bad_count30, 0)
	, nvl(new.appraise_default_count30, 0)
	, nvl(old.appraise_good_count, 0) + nvl(new.appraise_good_count, 0)
	, nvl(old.appraise_mid_count, 0) + nvl(new.appraise_mid_count, 0)
	, nvl(old.appraise_bad_count, 0) + nvl(new.appraise_bad_count, 0)
	, nvl(old.appraise_default_count, 0) + nvl(new.appraise_default_count, 0)
FROM (
	SELECT sku_id, spu_id, order_last_30d_count, order_last_30d_num, order_last_30d_amount
		, order_count, order_num, order_amount, payment_last_30d_count, payment_last_30d_num
		, payment_last_30d_amount, payment_count, payment_num, payment_amount, refund_last_30d_count
		, refund_last_30d_num, refund_last_30d_amount, refund_count, refund_num, refund_amount
		, cart_last_30d_count, cart_last_30d_num, cart_count, cart_num, favor_last_30d_count
		, favor_count, appraise_last_30d_good_count, appraise_last_30d_mid_count, appraise_last_30d_bad_count, appraise_last_30d_default_count
		, appraise_good_count, appraise_mid_count, appraise_bad_count, appraise_default_count
	FROM dwt_sku_topic
) old
	FULL JOIN (
		SELECT sku_id
			, sum(if(dt = '2020-03-29', order_count, 0)) AS order_count
			, sum(if(dt = '2020-03-29', order_num, 0)) AS order_num
			, sum(if(dt = '2020-03-29', order_amount, 0)) AS order_amount
			, sum(if(dt = '2020-03-29', payment_count, 0)) AS payment_count
			, sum(if(dt = '2020-03-29', payment_num, 0)) AS payment_num
			, sum(if(dt = '2020-03-29', payment_amount, 0)) AS payment_amount
			, sum(if(dt = '2020-03-29', refund_count, 0)) AS refund_count
			, sum(if(dt = '2020-03-29', refund_num, 0)) AS refund_num
			, sum(if(dt = '2020-03-29', refund_amount, 0)) AS refund_amount
			, sum(if(dt = '2020-03-29', cart_count, 0)) AS cart_count
			, sum(if(dt = '2020-03-29', cart_num, 0)) AS cart_num
			, sum(if(dt = '2020-03-29', favor_count, 0)) AS favor_count
			, sum(if(dt = '2020-03-29', appraise_good_count, 0)) AS appraise_good_count
			, sum(if(dt = '2020-03-29', appraise_mid_count, 0)) AS appraise_mid_count
			, sum(if(dt = '2020-03-29', appraise_bad_count, 0)) AS appraise_bad_count
			, sum(if(dt = '2020-03-29', appraise_default_count, 0)) AS appraise_default_count
			, sum(order_count) AS order_count30, sum(order_num) AS order_num30
			, sum(order_amount) AS order_amount30, sum(payment_count) AS payment_count30
			, sum(payment_num) AS payment_num30, sum(payment_amount) AS payment_amount30
			, sum(refund_count) AS refund_count30, sum(refund_num) AS refund_num30
			, sum(refund_amount) AS refund_amount30, sum(cart_count) AS cart_count30
			, sum(cart_num) AS cart_num30, sum(favor_count) AS favor_count30
			, sum(appraise_good_count) AS appraise_good_count30, sum(appraise_mid_count) AS appraise_mid_count30
			, sum(appraise_bad_count) AS appraise_bad_count30, sum(appraise_default_count) AS appraise_default_count30
		FROM dws_sku_action_daycount
		WHERE dt >= date_add('2020-03-29', -30)
		GROUP BY sku_id
	) new
	ON new.sku_id = old.sku_id
	LEFT JOIN dwd_dim_sku_info ON new.sku_id = dwd_dim_sku_info.id;

 优惠券主题宽表(预留)

在这里插入图片描述

活动主题宽表(预留) 

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您的问题是关于单一维离散小波变换DWT的Mallat算法在C++和MATLAB中的实现。 首先,我们来简单介绍一下DWT的Mallat算法。 DWT的Mallat算法是一种基于滤波器组的小波变换算法,其基本思想是通过一系列的低通滤波和高通滤波,将信号分解成多个不同尺度的子带信号。然后,对每个子带信号进行下采样,得到一组低分辨率子带信号和一组高分辨率子带信号。这些子带信号可以表示原始信号的不同频率和尺度成分,可以用于信号压缩、降噪、特征提取等应用。 在C++中实现该算法,需要定义滤波器组和下采样函数,然后按照Mallat算法进行递归分解和下采样,在每个尺度上得到一组子带系数。在MATLAB中,可以使用内置函数'dwt'来实现DWT的Mallat算法,也可以自己编写代码实现。 以下是C++和MATLAB实现DWT的Mallat算法的示例代码: C++代码: ```cpp #include <iostream> #include <vector> #include <cmath> using namespace std; // 定义低通和高通滤波器 vector<double> lpfilter = {0.7071, 0.7071}; // Daubechies4小波的低通滤波器 vector<double> hpfilter = {-0.7071, 0.7071}; // Daubechies4小波的高通滤波器 // 下采样函数 vector<double> downsample(vector<double> x) { vector<double> y; for (int i = 0; i < x.size(); i += 2) { y.push_back(x[i]); } return y; } // DWT的Mallat算法 vector<vector<double>> dwt(vector<double> x) { vector<vector<double>> coeffs; int n = x.size(); if (n == 1) { coeffs.push_back(x); return coeffs; } // 进行低通滤波和高通滤波 vector<double> lpd, hpd, lpr, hpr; for (int i = 0; i < lpfilter.size(); i++) { lpd.push_back(lpfilter[i]); hpd.push_back(hpfilter[i]); } for (int i = lpfilter.size(); i < n; i++) { lpd.push_back(0); hpd.push_back(0); } for (int i = 0; i < lpfilter.size(); i++) { lpr.push_back(lpfilter[lpfilter.size()-1-i]); hpr.push_back(-hpfilter[hpfilter.size()-1-i]); } for (int i = lpfilter.size(); i < n; i++) { lpr.push_back(0); hpr.push_back(0); } vector<double> cA(n/2), cD(n/2); for (int i = 0; i < n; i += 2) { double sum = 0, diff = 0; for (int j = 0; j < lpfilter.size(); j++) { sum += lpd[j] * x[(i+j)%n]; diff += hpd[j] * x[(i+j)%n]; } cA[i/2] = sum; cD[i/2] = diff; } coeffs.push_back(cA); coeffs.push_back(cD); // 递归分解 vector<vector<double>> subcoeffs = dwt(cA); coeffs.insert(coeffs.end(), subcoeffs.begin()+1, subcoeffs.end()); coeffs.push_back(cD); return coeffs; } int main() { vector<double> x = {1, 2, 3, 4, 5, 6, 7, 8}; vector<vector<double>> coeffs = dwt(x); for (int i = 0; i < coeffs.size(); i++) { cout << "Level " << i << ": "; for (int j = 0; j < coeffs[i].size(); j++) { cout << coeffs[i][j] << " "; } cout << endl; } return 0; } ``` MATLAB代码: ```matlab % 定义信号x和小波滤波器h和g x = [1 2 3 4 5 6 7 8]; h = [0.7071 0.7071]; % Daubechies4小波的低通滤波器 g = [-0.7071 0.7071]; % Daubechies4小波的高通滤波器 % DWT的Mallat算法 coeffs = {}; while length(x) > 1 % 进行低通滤波和高通滤波 lp = conv(h, x); hp = conv(g, x); % 下采样 cA = downsample(lp); cD = downsample(hp); % 存储系数 coeffs{end+1} = cA; coeffs{end+1} = cD; % 更新信号 x = cA; end coeffs{end+1} = x; % 输出系数 for i = 1:length(coeffs) fprintf('Level %d: ', i-1); disp(coeffs{i}); end % 下采样函数 function y = downsample(x) y = x(1:2:end); end ``` 希望这些代码对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值