基于Hadoop生态圈的数据仓库实践 —— 进阶技术(八)

八、多路径和参差不齐的层次
        本节讨论多路径层次,它是对单路径层次的扩展。上一节里数据仓库的月维度只有一条层次路径,即年-季度-月这条路径。在本节中加一个新的级别——促销期,并且加一个新的年-促销期-月的层次路径。这时月维度将有两条层次路径,因此具有多路径层次。本节讨论的另一个主题是不完全层次,这种层次在它的一个或多个级别上没有数据。

1. 增加一个层次
        下面的脚本给month_dim表添加一个叫做campaign_session的新列,并建立rds.campaign_session过渡表。
use dw;  

-- 增加促销期列
alter table month_dim rename to month_dim_old;
create table month_dim (    
    month_sk int comment 'surrogate key',    
    month tinyint comment 'month',  
    month_name varchar(9) comment 'month name', 
    campaign_session varchar(30) comment 'campaign session',
    quarter tinyint comment 'quarter',  
    year smallint comment 'year'    
)   
comment 'month dimension table'    
clustered by (month_sk) into 8 buckets    
stored as orc tblproperties ('transactional'='true') ;  
insert into month_dim select month_sk,month,month_name,null,quarter,year from month_dim_old;
drop table month_dim_old;

-- 建立促销期过渡表  
use rds;
create table campaign_session (  
    campaign_session varchar(30),  
    month tinyint,  
    year smallint 
)
row format delimited fields terminated by ',' stored as textfile;

        修改后的模式如下图所示。


        假设所有促销期都不跨年,并且一个促销期可以包含一个或多个年月,但一个年月只能属于一个促销期。为了理解促销期如何工作,看下表的示例。

Campaign Session

Month

2016 First Campaign

January-April

2016 Second Campaign

May-July

2016 Third Campaign

August-August

2016 Last Campaign

September-December

        每个促销期有一个或多个月。一个促销期也许并不是正好一个季度,也就是说,促销期级别不能上卷到季度,但是促销期可以上卷至年级别。2016年促销期的数据如下,并保存在campaign_session.csv文件中。
2016 First Campaign,1,2016
2016 First Campaign,2,2016
2016 First Campaign,3,2016
2016 First Campaign,4,2016
2016 Second Campaign,5,2016
2016 Second Campaign,6,2016
2016 Second Campaign,7,2016
2016 Third Campaign,8,2016
2016 Last Campaign,9,2016
2016 Last Campaign,10,2016
2016 Last Campaign,11,2016
2016 Last Campaign,12,2016
        现在可以执行下面的脚本把2016年的促销期数据装载进月维度。
use rds;
load data local inpath '/root/campaign_session.csv' overwrite into table campaign_session;

use dw;
drop table if exists tmp;
create table tmp as 
select t1.month_sk month_sk,
       t1.month month,
       t1.month_name month_name,
       t2.campaign_session campaign_session,
       t1.quarter quarter,
       t1.year year
  from month_dim t1 inner join rds.campaign_session t2 on t1.year = t2.year and t1.month = t2.month;
delete from month_dim where month_dim.month_sk in (select month_sk from tmp);
insert into month_dim select * from tmp;

select year,month,campaign_session from dw.month_dim;
        查询结果如下图所示,2016年的促销期已经有数据,其它年份的campaign_session字段值为null。

2. 层次查询
        下面的语句查询年-促销期-月层次。
USE dw; 

SELECT product_category, time, order_amount, order_quantity 
  FROM 
(
SELECT * 
  FROM 
(SELECT product_category,  
       year,  
       1 month,  
       year time,  
       1 sequence,  
       SUM(month_order_amount) order_amount,  
       SUM(month_order_quantity) order_quantity  
  FROM month_end_sales_order_fact a, product_dim b, month_dim c  
 WHERE a.product_sk = b.product_sk  
   AND a.order_month_sk = c.month_sk  
   AND year = 2016  
 GROUP BY product_category, year 
UNION ALL 
SELECT product_category,  
       year,  
       month,  
       campaign_session time,  
       2 sequence,  
       SUM(month_order_amount) order_amount,  
       SUM(month_order_quantity) order_quantity  
  FROM month_end_sales_order_fact a, product_dim b, month_dim c  
 WHERE a.product_sk = b.product_sk  
   AND a.order_month_sk = c.month_sk  
   AND year = 2016  
 GROUP BY product_category, year, month, campaign_session 
UNION ALL 
SELECT product_category,  
       year,  
       month,  
       month_name time,  
       3 sequence,  
       SUM(month_order_amount) order_amount,  
       SUM(month_order_quantity) order_quantity  
  FROM month_end_sales_order_fact a, product_dim b, month_dim c  
 WHERE a.product_sk = b.product_sk  
   AND a.order_month_sk = c.month_sk  
   AND year = 2016  
 GROUP BY product_category, year, quarter, month, month_name) t
CLUSTER BY product_category, year, month, sequence) t;
        查询结果如下图所示。

3. 不完全层次
        在一个或多个级别上没有数据的层次称为不完全层次。例如在特定月份没有促销期,那么月维度就具有不完全推广期层次。本小节说明不完全层次,还有在促销期上如何应用它。
        下面是一个不完全促销期(在ragged_campaign.csv文件里)的例子,2016年1月、4月、6月、9月、10月、11月和12月没有促销期。
,1,2016
2016 Early Spring Campaign,2,2016
2016 Early Spring Campaign,3,2016
,4,2016
2016 Spring Campaign,5,2016
,6,2016
2016 Last Campaign,7,2016
2016 Last Campaign,8,2016
,9,2016
,10,2016
,11,2016
,12,2016
        下面的命令先把campaign_session字段置空,然后向month_dim表装载促销期数据。
use rds;
load data local inpath '/root/ragged_campaign.csv' overwrite into table campaign_session;

use dw;
update month_dim set campaign_session = null;
drop table if exists tmp;
create table tmp as 
select t1.month_sk month_sk,
       t1.month month,
       t1.month_name month_name,
       case when t2.campaign_session != '' then t2.campaign_session else t1.month_name end campaign_session,
       t1.quarter quarter,
       t1.year year
  from month_dim t1 inner join rds.campaign_session t2 on t1.year = t2.year and t1.month = t2.month;
delete from month_dim where month_dim.month_sk in (select month_sk from tmp);
insert into month_dim select * from tmp;

select year,month,campaign_session from dw.month_dim;
        查询结果如下图所示。

        再次执行上面的层次查询语句,结果如下图所示。
        在有促销期月份的路径,月级别行的汇总与促销期级别的行相同。而对于没有促销期的月份,其促销期级别的行与月级别的行相同。也就是说,在没有促销期级别的月份,月上卷了它们自己。例如,6月没有促销期,所以在输出看到了两个6月的行(第2行和第3行)。第3行是月份级别的行,第2行表示是没有促销期的行。对于没有促销期的月份,促销期行的销售订单金额(输出里的order_amount列)与月分行的相同。
展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。

实用主义学Python(小白也容易上手的Python实用案例)

12-24
原价169,限时立减100元! 系统掌握Python核心语法16点,轻松应对工作中80%以上的Python使用场景! 69元=72讲+源码+社群答疑+讲师社群分享会  【哪些人适合学习这门课程?】 1)大学生,平时只学习了Python理论,并未接触Python实战问题; 2)对Python实用技能掌握薄弱的人,自动化、爬虫、数据分析能让你快速提高工作效率; 3)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 4)想修炼更好的编程内功,优秀的工程师肯定不能只会一门语言,Python语言功能强大、使用高效、简单易学。 【超实用技能】 从零开始 自动生成工作周报 职场升级 豆瓣电影数据爬取 实用案例 奥运冠军数据分析 自动化办公:通过Python自动化分析Excel数据并自动操作Word文档,最终获得一份基于Excel表格的数据分析报告。 豆瓣电影爬虫:通过Python自动爬取豆瓣电影信息并将电影图片保存到本地。 奥运会数据分析实战 简介:通过Python分析120年间奥运会的数据,从不同角度入手分析,从而得出一些有趣的结论。 【超人气老师】 二两 中国人工智能协会高级会员 生成对抗神经网络研究者 《深入浅出生成对抗网络:原理剖析与TensorFlow实现》一书作者 阿里云大学云学院导师 前大型游戏公司后端工程师 【超丰富实用案例】 0)图片背景去除案例 1)自动生成工作周报案例 2)豆瓣电影数据爬取案例 3)奥运会数据分析案例 4)自动处理邮件案例 5)github信息爬取/更新提醒案例 6)B站百大UP信息爬取与分析案例 7)构建自己的论文网站案例
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值