基于Hadoop生态圈的数据仓库实践进阶技术(四).doc
文本预览下载声明
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(四)
四、角色扮演维度
当一个事实表多次引用一个维度表时会用到角色扮演维度。例如,一个销售订单有一个是订单日期,还有一个交货日期,这时就需要引用日期维度表两次。
本节将说明两类角色扮演维度的实现,分别是表别名和数据库视图。这两种都使用了Hive的功能。表别名是在SQL语句里引用维度表多次,每次引用都赋予维度表一个别名。而数据库视图,则是按照事实表需要引用维度表的次数,建立相同数量的视图。
1. 修改数据库模式
使用下面的脚本修改数据库模式。分别给数据仓库里的事实表sales_order_fact和源数据库中订单销售表sales_order增加request_delivery_date_sk和request_delivery_date列。
[sql] view plain copy 在CODE上查看代码片派生到我的代码片
-- in hive
USE dw;
-- sales_order_fact表是ORC格式,增加列需要重建数据
ALTER TABLE sales_order_fact RENAME TO sales_order_fact_old;
CREATE TABLE sales_order_fact (
order_sk INT comment order surrogate key,
customer_sk INT comment customer surrogate key,
product_sk INT comment product surrogate key,
order_date_sk INT comment date surrogate key,
request_delivery_date_sk INT comment request delivery date surrogate key,
order_amount DECIMAL(10 , 2 ) comment order amount,
order_quantity INT COMMENT order_quantity
)
CLUSTERED BY (order_sk) INTO 8 BUCKETS
STORED AS ORC TBLPROPERTIES (transactional=true);
INSERT INTO sales_order_fact
SELECT order_sk, customer_sk, product_sk, order_date_sk, NULL, order_amount, order_quantity
FROM sales_order_fact_old;
DROP TABLE sales_order_fact_old;
USE rds;
ALTER TABLE sales_order ADD COLUMNS (request_delivery_date DATE COMMENT request delivery date) ;
-- in mysql
USE source;
ALTER TABLE sales_order ADD request_delivery_date DATE AFTER order_date ;
修改后源数据库模式如下图所示。
Hive不能像MySQL那样指定新增列的位置,它新增的列都是在表的最后。
2. 重建Sqoop作业
使用下面的脚本重建Sqoop作业,增加request_delivery_date列。
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
last_value=`sqoop job --show myjob_incremental_import --meta-connect jdbc:hsqldb:hsql://cdh2:16000/sqoop | grep incremental.last.value | awk {print $3}`
sqoop job --delete myjob_incremental_import --meta-connect jdbc:hsqldb:hsql://cdh2:16000/sqoop
sqoop job \
--meta-connect jdbc:hsqldb:hsql://cdh2:1
显示全部