基于Hadoop生态圈的数据仓库实践进阶技术五.docx
- 文档编号:10007014
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:43
- 大小:295.19KB
基于Hadoop生态圈的数据仓库实践进阶技术五.docx
《基于Hadoop生态圈的数据仓库实践进阶技术五.docx》由会员分享,可在线阅读,更多相关《基于Hadoop生态圈的数据仓库实践进阶技术五.docx(43页珍藏版)》请在冰豆网上搜索。
基于Hadoop生态圈的数据仓库实践进阶技术五
基于Hadoop生态圈的数据仓库实践——进阶技术(五)
五、快照
前面实验说明了处理维度的扩展。
本节讨论两种事实表的扩展技术。
有些用户,尤其是管理者,经常要看某个特定时间点的数据。
也就是说,他们需要数据的快照。
周期快照和累积快照是两种常用的事实表扩展技术。
周期快照是在一个给定的时间对事实表进行一段时期的总计。
例如,一个月销售订单周期快照汇总每个月底时总的销售订单金额。
累积快照用于跟踪事实表的变化。
例如,数据仓库可能需要累积(存储)销售订单从下订单的时间开始,到订单中的商品被打包、运输和到达的各阶段的时间点数据来跟踪订单生命周期的进展情况。
用户可能要取得在某个给定时间点,销售订单处理状态的累积快照。
下面说明周期快照和累积快照的细节问题。
1.周期快照
下面以销售订单的月底汇总为例说明如何实现一个周期快照。
首先需要添加一个新的事实表。
下图中的模式显示了一个名为month_end_sales_order_fact的新事实表。
该表中有两个度量值,month_order_amount和month_order_quantity。
这两个值是不能加到sales_order_fact表中的,原因是,sales_order_fact表和新的度量值有不同的时间属性(数据的粒度不同)。
sales_order_fact表包含的是每天一条记录。
新的度量值要的是每月的数据。
使用下面的脚本建立month_end_sales_order_fact表。
[sql]viewplaincopy在CODE上查看代码片派生到我的代码片
USEdw;
CREATETABLEmonth_end_sales_order_fact(
order_month_skINTCOMMENT'ordermonthsurrogatekey',
product_skINTCOMMENT'productsurrogatekey',
month_order_amountDECIMAL(10,2)COMMENT'monthorderamount',
month_order_quantityINTCOMMENT'monthorderquantity'
)
CLUSTEREDBY(order_month_sk)INTO8BUCKETS
STOREDASORCTBLPROPERTIES('transactional'='true');
建立了month_end_sales_order_fact表后,现在需要向表中装载数据。
月底销售订单事实表的数据源是已有的销售订单事实表。
month_sum.sql文件用于装载月底销售订单事实表,该文件内容如下。
[sql]viewplaincopy在CODE上查看代码片派生到我的代码片
--设置变量以支持事务
sethive.support.concurrency=true;
sethive.exec.dynamic.partition.mode=nonstrict;
sethive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
setpactor.initiator.on=true;
setpactor.worker.threads=1;
USEdw;
SEThivevar:
pre_month_date=add_months(current_date,-1);
deletefrommonth_end_sales_order_fact
wheremonth_end_sales_order_fact.order_month_skin
(selectmonth_sk
frommonth_dim
wheremonth=month(${hivevar:
pre_month_date})
andyear=year(${hivevar:
pre_month_date}));
insertintomonth_end_sales_order_fact
selectb.month_sk,a.product_sk,sum(order_amount),sum(order_quantity)
fromsales_order_facta,
month_dimb,
order_date_dimd--视图
wherea.order_date_sk=d.order_date_sk
andb.month=d.month
andb.year=d.year
andb.month=month(${hivevar:
pre_month_date})
andb.year=year(${hivevar:
pre_month_date})
groupbyb.month_sk,a.product_sk;
每个月第一天,在每天销售订单定期装载执行完后,执行此脚本,装载上个月的销售订单数据。
为此需要修改Oozie的工作流定义。
(1)修改工作流作业配置文件
修改后的workflow.xml文件内容如下:
[html]viewplaincopy在CODE上查看代码片派生到我的代码片
xmlversion="1.0"encoding="UTF-8"?
>
oozie: workflow: 0.1"name="regular_etl"> oozie: sqoop-action: 0.2"> mysql: //cdh1: 3306/source? useSSL=false oozie: sqoop-action: 0.2"> mysql: //cdh1: 3306/source? useSSL=false oozie: sqoop-action: 0.2"> hsqldb: hsql: //cdh2: 16000/sqoop oozie: hive-action: 0.2"> ${dateeq20} oozie: hive-action: 0.2"> errorMessage(wf: lastErrorNode())}] 在该文件中增加了一个decision-node,当date参数的值等于20时,执行month_sum.sql文件后结束,否则直接结束。 之所以这里是20是为了测试。 month_sum.sql文件中用的是add_months(current_date,-1)取上个月的年月,因此不必要非得1号执行,任何一天都可以。 这个工作流保证了每月汇总只有在每天汇总执行完后才执行,并且每月只执行一次。 工作流DAG如下图所示。 (2)修改协调作业配置文件 修改后的coordinator.xml文件内容如下: [html]viewplaincopy在CODE上查看代码片派生到我的代码片 days (1)}"start="${start}"end="${end}"timezone="${timezone}"xmlns="uri : oozie: coordinator: 0.1"> 在该文件中增加了一个date属性,用于向workflow.xml文件传递date参数的值。 (3)修改协调作业属性文件 修改后的job-coord.properties文件内容如下: [plain]viewplaincopy在CODE上查看代码片派生到我的代码片 nameNode=hdfs: //cdh2: 8020 jobTracker=cdh2: 8032 queueName=default oozie.use.system.libpath=true oozie.coord.application.path=${nameNode}/user/${user.name} timezone=UTC start=2016-07-20T01: 30Z end=2020-12-31T01: 30Z workflowAppUri=${nameNode}/user/${user.name} 该文件中只修改了start和end属性的值以用于测试。 (4)部署工作流和协调作业 [plain]viewplaincopy在CODE上查看代码片派生到我的代码片 hdfsdfs-put-fcoordinator.xml/user/root/ hdfsdfs-put-f/root/workflow.xml/user/root/ hdfsdfs-put-f/etc/hive/conf.cloudera.hive/hive-site.xml/tmp/ hdfsdfs-put-f/root/mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar/tmp/ hdfsdfs-put-f/root/regular_etl.sql/tmp/ hdfsdfs-put-f/root/month_sum.sql/tmp/ (5)运行协调作业进行测试 [plain]viewplaincopy在CODE上查看代码片派生到我的代码片 ooziejob-ooziehttp: //cdh2: 11000/oozie-config/root/job-coord.properties-run-Ddate=`date+"%d"` 通过命令行的-D参数传递date属性的值,date为当前日期数,执行时是20号。 到了9点半工作流开始运行,等执行完全成功后,month_end_sales_order_fact表中有了2016年6月销售订单汇总的两条数据,如下图所示。 order_month_sk的值为198,使用下面的查询可以确认对应的年月是2016年6月。 [sql]viewplaincopy在CODE上查看代码片派生到我的代码片 selectyear,monthfrommonth_dimwheremonth_sk=198; 2.累积快照 本小节说明如何在销售订单上实现累积快照。 该累加快照跟踪五个销售订单的里程碑: 下订单、分配库房、打包、配送和收货。 这五个里程碑的日期及其各自的数量来自源数据库的销售订单表。 一个订单完整的生命周期由五行描述: 下订单的时间一行,订单商品被分配到库房的时间一行,产品打包的时间一行,订单配送的时间一行,订单客户收货的时间一行。 每个里程碑各有一个状态: N为新订单,A为已分配库房,P为已打包,S为已配送,R为已收货。 源数据库的sales_order表结构必须做相应的改变,以处理五种不同的状态。 (1)修改数据库模式 执行下面的脚本修改数据库模式。 [sql]viewplaincopy在CODE上查看代码片派生到我的代码片 --MySQL USEsource; --修改销售订单事务表 ALTERTABLEsales_order CHANGEorder_datestatus_datedatetime ADDorder_statusVARCHAR (1)AFTERstatus_date CHANGEorder_quantityquantityINT; --删除sales_order表的主键 altertablesales_orderchangeorder_numberorder_numberintnotnull; altertablesales_orderdropprimarykey; --建立新的主键 altertablesales_orderaddidintunsignednotnullauto_incrementprimarykeycomment'主键'first; --Hive --rds.sales_order并没有增加id列,原因有两个: --1.该列只作为增量检查列,不用存储 --2.不用再重新导入所有数据 userds; altertablesales_order changeorder_datestatus_datetimestampcomment'statusdate'; altertablesales_order changeorder_quantityquantityintcomment'quantity'; altertablesales_order addcolumns(order_statusvarchar (1)comment'orderstatus'); USEdw; --事实表增加八列 altertablesales_order_factrenametosales_order_fact_old; createtablesales_order_fact ( order_skintcomment'ordersurrogatekey', customer_skintcomment'customersurrogatekey', product_skintcomment'productsurrogatekey', order_date_skintcomment'orderdatesurrogatekey', allocate_date_skintcomment'allocatedatesurrogatekey', allocate_quantityintcomment'allocatequantity', packing_date_skintcomment'packingdatesurrogatekey', packing_quantityintcomment'packingquantity', ship_date_skintcomment'shipdatesurrogatekey', ship_quantityintcomment'shipquantity', receive_date_skintcomment'receivedatesurrogatekey', receive_quantityintcomment'receivequantity', request_delivery_date_skintcomment'requestdeliverydatesurrogatekey', order_amountdecimal(10,2)comment'orderamount', order_quantityintcomment'orderquantity' ) CLUSTEREDBY(order_sk)INTO8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于Hadoop生态圈的数据仓库实践 进阶技术五 基于 Hadoop 生态 数据仓库 实践 进阶 技术