《8part-大数据仓库与挖掘平台-Hive数据仓库.pptx》由会员分享,可在线阅读,更多相关《8part-大数据仓库与挖掘平台-Hive数据仓库.pptx(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Hive数据仓库概念数据仓库是一个面向主题的、集成的、随时间变化的、非易失的数据集合,用于支持决策。它主要的目标是分析和处理数据,和传统的操作型事务处理有很大区别ETL:必须在某个时点从操作型系统获取数据并将其导入数据仓库,这个过程就是通常所说的抽取(extract)、转换(transform)和装载(load)过程,简称ETL过程数据需求:通过数据仓库,既可以周期性地回答已知的问题(如报表等),也可以进行即席查询(ad-hoc queries)数据仓库与数据库对比多维数据模型基础数据仓库主要有规范化数据模型、多维数据模型、Data Vault数据模型等建模方法,其中前两种使用最为广泛规范化模
2、型用于企业级数据仓库(EDW)建模,而多维模型多用于数据集市建模规范化模型对于数据库设计者来说非常熟悉,其核心思想就是消除数据冗余以保证数据一致性和事务处理的性能:1NF,2NF,3NF对于多维模型最简单的描述是,按照事实表、维度表来构建数据仓库或数据集市,这种模型被人们熟知的有星型和雪花型。多维数据模型基础星型模型是部署在关系数据库管理系统之上的多维结构,主要包含事实表,以及通过主键/外键关系与之关联的维度表。在星型模型实施中,所有维度级别的数据存储在单个表或视图中。雪花模型就是将维度层次进一步规范化为子维度。在雪花模型实施中,使用多个表或视图来存储维度级别数据。单独的数据库表或视图存储与维
3、中每个级别相关的数据。多维数据模型基础星型模型是部署在关系数据库管理系统之上的多维结构,主要包含事实表,以及通过主键/外键关系与之关联的维度表。在星型模型实施中,所有维度级别的数据存储在单个表或视图中。雪花模型就是将维度层次进一步规范化为子维度。在雪花模型实施中,使用多个表或视图来存储维度级别数据。单独的数据库表或视图存储与维中每个级别相关的数据。多维数据模型基础在Hadoop上实现数据仓库传统的数据仓库并不是一个单一系统,而是由一系列协同工作的组件联合构成,包括ETL过程,RDS,TDS,数据目录,查询引擎,用户界面,自动化调度在Hadoop上实现数据仓库RDS(RAW DATA STORE
4、S)和TDS(TRANSFORMED DATA STORES)这些组件负责实际存储数据仓库中的数据与Hadoop对应 抽取:Sqoop,Flume 转换与装载:Hive,MapReduce,Pig。过程管理:Falcon,Oozie,Azkaban 数据目录:HCatalog,Altas 查询引擎和SQL层:Spark SQL,Hive,Impala等用户界面Hue和Zeppelin在Hadoop上实现数据仓库实例ERD设计在Hadoop上实现数据仓库实例多维数据仓库包含有一个销售订单事实表,产品、客户、订单、日期四个维度表在Hadoop上实现数据仓库实例维度表除了日期维度外,其它三个表都在源
5、表的基础上增加了代理键、版本号、生效日期、过期日期四个属性,用来处理渐变维(SCD)。日期维度有其特殊性,该维度数据一旦生成就不会改变,所以不需要版本号、生效日期、过期日期。代理键是维度表的主键。事实表引用维度表的代理键作为自己的外键,销售金额是当前事实表中的唯一度量。在Hadoop上实现数据仓库实例Hive相关配置处理渐变维(SCD)和生成代理键处理渐变维需要配置Hive支持行级更新,并在建表时选择适当的文件格式。生成代理键在关系数据库中一般都是用自增列或序列对象维度可以根据变化剧烈程度主要分为无变化维度、缓慢变化维度和剧烈变化维度缓慢渐变维,即维度中的属性可能会随着时间发生改变,比如包含用
6、户住址Address的DimCustomer维度,用户的住址可能会发生改变,进而影响业务统计精度,DimCustomer维度就是缓慢渐变维(SCD)在Hadoop上实现数据仓库实例选择文件格式 a)如果数据有参数化的分隔符,那么可以选择TEXTFILE格式。b)如果数据所在文件比块尺寸小,可以选择SEQUENCEFILE格式。c)如果想执行数据分析,并高效地存储数据,可以选择RCFILE格式。d)如果希望减小数据所需的存储空间并提升性能,可以选额ORCFILE格式。对于多维数据仓库来说,需要处理SCD,必然要用到行级更新,所以所有TDS(转换后的数据存储)里的表,除日期维度表外,其它表都是用O
7、RCFILE格式。日期维度表数据一旦生成就不会修改,所以使用TEXTFILE格式。RDS(原始数据存储)里的表使用缺省的TEXTFILE格式支持行级更新在Hadoop上实现数据仓库实例ETL 从源抽取数据导入数据仓库(本示例的RDS)有两种方式,可以从源把数据抓取出来(拉),也可以请求源把数据发送(推)到数据仓库。影响选择数据抽取方式的一个重要因素是操作型系统的可用性和数据量,这基于是抽取整个数据还是仅仅抽取自最后一次抽取以来的变化数据。考虑以下两个问题:需要抽取哪部分源数据加载到数据仓库?有两种方式,完全抽取和变化数据捕获。数据抽取的方向是什么?有两种方式,拉模式(从数据仓库去拉)和推模式(
8、通过源去推)。在Hadoop上实现数据仓库实例ETL完全抽取和变化数据捕获(CDC)如果数据量很小并且易处理,一般来说采取完全源数据抽取(将所有的文件记录或所有的数据库表数据抽取至数据仓库)。这种方式适合引用类型的源数据,比如邮政编码。引用型源数据通常是维度表的源。如果源数据量很大,抽取全部数据是不可行的,那么只能抽取变化的源数据(自最后一次抽取以来变化的数据)。这种数据抽取模式称为变化数据捕获(CDC),通常被用于抽取操作型系统的事务数据,比如销售订单 CDC大体可以分为两种,一种是侵入式的,另一种是非侵入式的。所谓侵入式的是指CDC操作会给源系统带来性能的影响。只要CDC操作以任何一种方式
9、执行了SQL语句,就可以认为是侵入式的CDC。常用的四种CDC方法中有三种是侵入性的,这四种方法是:基于时间戳的CDC、基于触发器的CDC、基于快照的CDC、基于日志的CDC在Hadoop上实现数据仓库实例ETL在Hadoop上实现数据仓库实例ETL维度历史的处理大多数维度值是随着时间改变的。客户改变了姓名,产品的名称或分类变化等。当一个维度改变,比如一个产品有了新的分类,必须要维护维度的历史。在这种情况下,product_dim表里必须既存储产品老的分类,也存储产品当前的分类。并且,老的销售订单里的产品分类信息引用老的分类。渐变维(SCD)即是一种在多维数据仓库中实现维度历史的技术。有三种不
10、同的SCD技术:SCD 类型1(SCD1),SCD类型2(SCD2),SCD类型3(SCD3)在Hadoop上实现数据仓库实例ETLSCD1通过修改维度记录直接覆盖已存在的值,它不维护记录的历史。SCD1一般用于修改错误的数据。SCD2在源数据发生变化时,给维度记录建立一个新的“版本”,从而维护维度历史。SCD2不删除、修改已存在的数据。SCD3保持维度记录的一个版本。它通过给某个数据单元增加多个列来维护历史。例如,为了维护客户地址,customer_dim维度表有一个customer_address列和一个previous_customer_address列。SCD3可以有效维护有限的历史,
11、而不像SCD2那样维护全部历史。SCD3很少使用。它只适用于数据库空间不足并且用户接受有限维度历史的情况。数据仓库之拉链表什么是拉链表拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息数据仓库之拉链表拉链表的使用场景有一些表的数据量很大,比如一张用户表,大约10亿条记录,50个字段,这种表,即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些。表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。需要查看某一个时间点或者时间段的历史快
12、照信息,比如,查看某一个订单在历史某一个时间点的状态。表中的记录变化的比例和频率不是很大,比如,总共有10亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小。数据仓库之拉链表方案一:每天只留最新的一份,比如我们每天用Sqoop抽取最新的一份全量数据到Hive中。方案二:每天保留一份全量的切片数据。方案三:使用拉链表。拉链表的设计和实现在2017-01-01这一天表中的数据是:在2017-01-02这一天表中的数据是,用户002和004资料进行了修改,005是新增用户:拉链表的设计和实现在2017-01-03这一天表中的数据是,用户004和005资料进行了修改,006是新增用户:拉
13、链表的设计和实现如果在数据仓库中设计成历史拉链表保存该表,则会有下面这样一张表,这是最新一天(即2017-01-03)的数据:t_start_date表示该条记录的生命周期开始时间,t_end_date表示该条记录的生命周期结束时间。t_end_date=9999-12-31表示该条记录目前处于有效状态。如果查询当前所有有效的记录,则select*from user where t_end_date=9999-12-31。如果查询2017-01-02的历史快照,则select from user where t_start_date=2017-01-02。Hive中实现拉链表要确定拉链表的时间
14、粒度每日的用户更新表ods层的user表CREATE EXTERNAL TABLE ods.user(user_num STRING COMMENT 用户编号,mobile STRING COMMENT 手机号码,reg_date STRING COMMENT 注册日期COMMENT 用户资料表PARTITIONED BY(dt string)ROW FORMAT DELIMITED FIELDS TERMINATED BY t LINES TERMINATED BY nSTORED AS ORCLOCATION/ods/user;)Hive中实现拉链表要确定拉链表的时间粒度每日的用户更新表o
15、ds层的user表CREATE EXTERNAL TABLE ods.user(user_num STRING COMMENT 用户编号,mobile STRING COMMENT 手机号码,reg_date STRING COMMENT 注册日期COMMENT 用户资料表PARTITIONED BY(dt string)ROW FORMAT DELIMITED FIELDS TERMINATED BY t LINES TERMINATED BY nSTORED AS ORCLOCATION/ods/user;)Hive中实现拉链表user_update表CREATE EXTERNAL TAB
16、LE ods.user_update(user_num STRING COMMENT 用户编号,mobile STRING COMMENT 手机号码,reg_date STRING COMMENT 注册日期COMMENT 每日用户资料更新表PARTITIONED BY(dt string)ROW FORMAT DELIMITED FIELDS TERMINATED BY t LINES TERMINATED BY nSTORED AS ORCLOCATION/ods/user_update;)Hive中实现拉链表拉链表CREATE EXTERNAL TABLE dws.user_his(use
17、r_num STRING COMMENT 用户编号,mobile STRING COMMENT 手机号码,reg_date STRING COMMENT 用户编号,t_start_date,t_end_dateCOMMENT 用户资料拉链表ROW FORMAT DELIMITED FIELDS TERMINATED BY t LINES TERMINATED BY nSTORED AS ORCLOCATION/dws/user_his;)Hive中实现拉链表实现sql语句假设我们已经已经初始化了2017-01-01的日期,然后需要更新2017-01-02那一天的数据INSERT OVERWRI
18、TE TABLE dws.user_hisSELECT*FROM(SELECT A.user_num,A.mobile,A.reg_date,A.t_start_time,CASE WHEN A.t_end_time=9999-12-31 AND B.user_num IS NOT NULL THEN 2017-01-01 ELSE A.t_end_time END AS t_end_time FROM dws.user_his AS A LEFT JOIN ods.user_update AS B ON A.user_num=B.user_numUNION SELECT C.user_num,C.mobile,C.reg_date,2017-01-02 AS t_start_time,9999-12-31 AS t_end_time FROM ods.user_update AS C)AS T