热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

二、按需装载前面已经做了“初始装载”和“定期装载”。还有一种需要熟悉的装载类型,按需装载。所谓“按需装载”指的是,在正常调度之外,当源数据有效或者数据仓库需要时进行装载。例如,促销销售
二、按需装载
        前面已经做了“初始装载”和“定期装载”。还有一种需要熟悉的装载类型,按需装载。所谓“按需装载”指的是,在正常调度之外,当源数据有效或者数据仓库需要时进行装载。例如,促销销售源数据只有在促销期内有效,而在其它时间是无效的,而对促销期数据就要进行按需装载。
        在“建立数据仓库示例模型”中讨论的日期维度数据生成可以看做是一种按需装载。数据仓库预先装载了日期,当日期用完时,需要再次运行预装载。
        本节的主题是按需装载,首先修改数据库模式,然后在DW数据库上执行按需装载,使用促销期场景进行说明。定期装载不适合促销期场景,因为促销期数据并不是按调度定期装载。下面是需要装载的促销期内容,存储在source.promo_schedule表中。
PROMOTION CODE,PROMOTION NAME,START DATE,END DATESO,Special Offer,2016-04-01,2016-04-10
DP,Disk Promotion,2016-05-05,2016-05-20
MS,Month Special,2016-06-01,2016-06-30
MP,Monitor Promotion,2016-07-10,2016-07-15
BS,Back to School,2016-08-10,2016-08-30
        注意源数据提供了促销周期,而不是单个的促销日期。示例假设只需要装载新的促销期数据,而在数据仓库中不需要促销期的历史数据。
        下图显示了修改后的DW数据库模式,date_dim表增加了promo_ind列,用来标识该日期是否为促销日期。
  1. 修改数据库模式
        使用下面的SQL脚本修改源数据库模式。
use source;-- 建立促销期表create table promo_schedule (    promotion_code varchar(10) comment '促销期代码',    promotion_name varchar(50) comment '促销期名称',    start_date date comment '促销期开始日期',    end_date date comment '促销期截止日期',    primary key (promotion_code));-- 添加促销期数据insert into promo_schedule values('SO','Special Offer','2016-04-01','2016-04-10'),('DP','Disk Promotion','2016-05-05','2016-05-20'),('MS','Month Special','2016-06-01','2016-06-30'),('MP','Monitor Promotion','2016-07-10','2016-07-15'),('BS','Back to School','2016-08-10','2016-08-30');commit;
        使用下面的HiveQL脚本修改RDS数据库模式。
use rds;create table promo_schedule (    promotion_code varchar(10) comment 'promotion code',    promotion_name varchar(50) comment 'promotion name',    start_date date comment 'start date',    end_date date comment 'end date');
        使用下面的HiveQL脚本修改DW数据库模式。  
use dw;alter table date_dim rename to date_dim_old; -- 原来的日期维度表是普通的CSV文件格式,因为需要行级更新促销标记字段,所以新建ORC文件格式的表。create table date_dim (        date_sk int comment 'surrogate key',      date date comment 'date,yyyy-mm-dd',      month tinyint comment 'month',      month_name varchar(9) comment 'month name',      quarter tinyint comment 'quarter',      year smallint comment 'year',    promo_ind char(1) comment 'promotion index')  comment 'date dimension table'clustered by (date_sk) into 8 bucketsstored as orc tblproperties ('transactional'='true');-- 装载日期维度数据,促销期标记为'N'insert into date_dim select *,'N' from date_dim_old;-- 删除老的日期维度表drop table date_dim_old;
2. 新建按需装载脚本
        使用下面的on_demand.sh脚本完成按需装载过程。
#!/bin/bash  # 整体拉取promo_schedule表数据  sqoop import --connect jdbc:mysql://cdh1:3306/source?useSSL=false --username root --password mypassword --table promo_schedule --hive-import --hive-table rds.promo_schedule --hive-overwrite  # 调用 on_demand.sql 文件执行按需装载  beeline -u jdbc:hive2://cdh2:10000/dw -f on_demand.sql
        on_demand.sql文件中的HiveQL脚本如下:
-- 设置变量以支持事务  set hive.support.cOncurrency=true;  set hive.exec.dynamic.partition.mode=nonstrict;  set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;  set hive.compactor.initiator.on=true;  set hive.compactor.worker.threads=1;    use dw;update date_dim      set promo_ind = 'Y'     where date_dim.date_sk in(select a.date_sk    from date_dim a, rds.promo_schedule b  where a.date between b.start_date and b.end_date);
        需要在日期装载后运行该脚本,换句话说,所有促销期内从开始到结束的日期,在日期维度里都是存在的。实际上装载所做的就是,如果一个日期在一个促销期内,则设置date_dim表的promo_ind列为‘Y’。
  
2. 测试
        使用下面的命令执行按需装载。
./on_demand.sh
        使用下面的查询验证结果。
select case when year is null then '' else cast(year as string) end as year,       case when year is null then '' else cast(month as string) end as month,       count,       case when year is null then '' else cast(start_date as string) end as start_date,       case when year is null then '' else cast(end_date as string) end as end_datefrom (select year,       month,       count(*) count,       min(date) start_date,       max(date) end_date,       case when year is null then 1 else 0 end as flg   from date_dim  where promo_ind = 'Y'  group by year,month grouping sets((year,month),()) cluster by flg,year,month) t;
        查询结果如下图所示。

        在五个促销期里有共有83的促销日。第一个周期有10天(2016年4月1日、2016年4月2日;…2016年4月10日),第二个促销周期有16天(2016年5月5日,2016年5月6日;…2016年5月20日),等等。查询第一个周期应该有10天的promo_ind列上具有‘ Y’值。
推荐阅读
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • RMAN中的不完整恢复是指通过还原所有数据文件将整个数据库回退,然后执行不完全恢复的操作。不完整恢复的场景包括完整恢复不可行或故意要丢失数据。完整恢复需要备份后生成的所有归档日志和联机重做日志,而如果这些日志缺失或损坏,恢复将在该点停止。决定故意丢失数据是在用户错误发生后采取的行动,例如忘了where条件导致整个表受影响。对于已提交的事务来说,这样的更改是不可逆的。 ... [详细]
author-avatar
dsjdsjdsjjk_896
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有