目录
一、基本介绍
数据仓库是一个面向主题的、集成的、随时间变化的、但信息本身相对稳定的数据集合,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。帮助决策者能快速有效的自大量资料中,分析出有价值的资讯,以利决策拟定及快速回应外在环境变动,帮助建构商业智能(BI)。
通俗来说,当我们在完成一项项目时,该项目拥有多种数据来源,如:Mysql数据库、MongoDB、第三方数据等,而该项目的目的是将不同数据来源的数据整合在一起以便于进行数据分析。由此数据仓库是一种环境亦是一种整合过程而非一项产品。
二、数据仓库的特点
1、面向主题
面向主题特性是数据仓库和操作型数据库的根本区别。操作型数据库是为了支撑各种业务而建立,而分析型数据库则是为了对从各种繁杂业务中抽象出来的分析主题(如用户、成本、商品等)进行分析而建立;它与传统数据库中的面向应用相对应。主题是一个抽象的概念,是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个操作型信息系统相关。
2、数据集成
集成性是指数据仓库会将不同源数据库中的数据汇总到一起;操作型数据库通常与某些特定的应用相关,数据库之间相互独立,并且往往是异构的。而数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整理得到的,必须消除源数据中的不一致性,以保证数据仓库内的信息是关于整个企业的一致的全局信息。数据仓库的集成特性是指在数据进入数据仓库之前,必须经过数据加工和集成,这是建立数据仓库的关键步骤。它能够统一原始数据中的矛盾之处,还能够将原始数据结构从面向应用向面向主题转变。
3、相对稳定
数据仓库内的数据是面向公司全局的。比如某个主题域为成本,则全公司和成本有关的信息都会被汇集进来;
操作型数据库中的数据通常实时更新,数据根据需要及时发生变化。数据仓库的数据主要供企业决策分析之用,所涉及的数据操作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,但修改和删除操作很少,通常只需要定期的加载、刷新。
4. 反映历史变化
较之操作型数据库,数据仓库的时间跨度通常比较长。前者通常保存几个月,后者可能几年甚至几十年;前者主要关心当前某一个时间段内的数据,而数据仓库中的数据通常包含历史信息,系统记录了企业从过去某一时点(如开始应用数据仓库的时点)到目前的各个阶段的信息,通过这些信息,可以对企业的发展历程和未来趋势做出定量分析和预测。
三、数仓工具
1、一般工具
Hive大数据数据仓库工具,一般结合HDFS用,Hive主要优势是免费。其它常用数据仓库还有Oracle,DB2,AWS Redshift,Greenplum等。而针对企业开发的数据仓库Teradata,其特点:数据仓库配备性能最高、最可靠的大规模并行处理平台,能够高速处理海量数据,其性能远远高于Hive。它使得企业可以专注于业务,无需花费大量精力管理技术,因而可以更加快速地做出明智的决策,实现 ROI投资回报率最大化。
2、大数据学习工具之Hive
2.1 Hive的大数据学习优势
◎依赖分布式文件系统HDFS存储数据
◎依赖分布式并行计算模型MapReduce处理数据
◎借鉴SQL语言设计了新的查询语言HiveQL
2.2 Hive数据仓库架构及原理
架构图转载至https://blog.youkuaiyun.com/hansionz/article/details/106004864
1、用户接口:Client
CLI(hive shell或者hiveserver2)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)
2、元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
3、Hadoop集群
使用HDFS进行存储,使用MapReduce进行计算。
4、Driver:驱动器
解析器(SQL Parser)将SQL字符串转换成抽象语法树AST,对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误,主要就是用于解析sql语法。
编译器(Physical Plan):将AST编译生成逻辑执行计划,将解析之后的sql语法进行编译成为MR的任务。
优化器(Query Optimizer):对逻辑执行计划进行优化,有一定的优化功能,自动的会对我们写的sql语句进行调优,但是调优的功能有限的。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务.提交mr的任务到yarn上面去执行的。
四、数据仓库作用
数据仓库技术可以将企业多年积累的数据唤醒,不仅为企业管理海量数据,分析数据,而且挖掘数据潜在的价值,从而成为通信企业运营维护系统的亮点之一。广义的说,基于数据仓库的决策支持系统由三个部件组成:①数据仓库技术②联机分析处理技术③数据挖掘技术。其中数据仓库技术是系统的核心。
举例来说:以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。
数据仓库应用主要使用的技术如下:
1、并行
计算的硬件环境、操作系统环境、数据库管理系统和所有相关的数据库操作、查询工具和技术、应用程序等各个领域都可以从并行的最新成就中获益。
2、分区
分区功能使得支持大型表和索引更容易,同时也提高了数据管理和查询性能。
3、数据压缩
数据压缩功能降低了数据仓库环境中通常需要的用于存储大量数据的磁盘系统的成本,新的数据压缩技术也已经消除了压缩数据对查询性能造成的负面影响。
五、数仓分层
数据仓库架构可分为三层——源数据、数据仓库、数据应用。 数据仓库的数据来源于不同的数据源,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。
1、数仓分层作用
为了减少重复计算:越到底层,越接近业务发生的记录,越到上层,越接近业务目标。具体如下:
①清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解,实现业务数据解耦。通过消除数据间的依赖关系降低维护成本。
②减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
③复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题,发生错误时也只解决出错的步骤。
2、分层架构
2.1源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备,用来保管我们的原始数据的。
①保持数据原貌不做任何修改,起到备份数据的作用
②数据采用压缩,减少磁盘存储空间(如:原始数据100G,可以压缩到10G左右)
③创建分区表,防止后续的全表扫描
2.2数据仓库层(DW):DW层的数据是一致的、准确的、干净的数据,即对源数据进行了清洗(去除了杂质)后的数据。主要是用于面向数据分析的,大部分的工作,都是在这一层,写sql。其中DW层又可以被细分为三层:
①DWD (明细层):作用将ODS层数据根据业务主体要求,将OSD数据抽取到DW层,形成一份最详细的明细数据,同时该层也会做一部分的数据聚合,将相同主题的数据汇集到一张表中,提高数据的可用性。
例如: ODS层有一个时间字段 date 内容2020-12-25 15:30:20 但是后续需要分别根据 年月日 小时来统计: 转换工作:将date字段拆分成多个字段。
②DWM层 (中间层):
作用:对DWD层的数据根据某些维度进行具和操作,形成一份中间表数据。
例如: 我们按照对实施表分别按照 年 月 日 小时老统计操作 (即周期快照事实表)
需求:统计每年每月每天每小时的访问量
统计每年每月每天访问量
统计每年每月访问量
统计每年访问量
如果没有中间表,每一次都需要找事务事实表,进行一次聚合操作,如果有中间表,可以先在中间表为其按照小时聚合统计形成一份结果数据,后续统计每年每月每天访问量的时候,只需要将每小时对应累加在一起即可(即不再通过查表的具体时刻相聚和的形式)
③DWS层 (业务层)
作用:主要是对DWD 和DWM层数据进行聚合统一操作,这一次聚合统计是需要将各个维度的数据都要细化统计出来,按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询。
(注意:这一层在大多数情况已经是最终结果数据了)
2.3数据展示层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。数据的报表展示。
2.4维表层(Dimension):
维表层主要包含两部分数据:
①高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。
②低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万。
3、分层实例
假设一个用户行为分析应用场景:
在ODS层中,由于各端的开发团队不同或者各种其它问题,用户的访问日志被分成了好几张表上报到了我们的ODS层。
为了方便大家的使用,我们在DWD层做了一张用户访问行为天表,在这里,我们将PC网页、H5、小程序和原生APP访问日志汇聚到一张表里面,统一字段名,提升数据质量,这样就有了一张可供大家方便使用的明细表了。
在DWM层,我们会从DWD层中选取业务关注的核心维度来做聚合操作,比如只保留人、商品、设备和页面区域维度。类似的,我们这样做了很多个DWM的中间表
然后在DWS层,我们将一个人在整个网站中的行为数据放到一张表中,这就是我们的宽表了,有了这张表,就可以快速满足大部分的通用型业务需求了。
最后,在APP应用层,根据需求从DWS层的一张或者多张表取出数据拼接成一张应用表即可。
4、技术应用
Data Source:数据源一般是业务库和埋点,当然也会有第三方购买数据等多种数据来源方式。业务库的存储一般是Mysql 和 PostgreSql。
ODS 层:ODS 的数据量一般非常大,所以大多数公司会选择存在HDFS上,即Hive或者Hbase,Hive居多。
DW 层:一般和 ODS 的存储一致,但是为了满足更多的需求,也会有存放在 PG 和 ES 中的情况。
APP 层:应用层的数据,一般都要求比较快的响应速度,因此一般是放在 Mysql、PG、Redis中。
六、实例
1、数据来源
1.1业务数据
业务数据往往产生于事务型过程处理,所以一般存储在关系型数据库中,如mysql、oracle;
业务数据源:用户基本信息、商品分类信息、商品信息、店铺信息、订单数据、订单支付信息、活动信息、物流信息等
1.2埋点日志
埋点日志相对业务数据是用于数据分析、挖掘需求,一般以日志形式存储于日志文件中,随后通过采集落地分布式存储介质中如hdfs、hbase;
用户行为日志:用户浏览、用户点评、用户关注、用户搜索、用户投诉、用户咨询。
1.3外部数据
一般公司都会通过线上广告来进行获客,与三方公司合作更多的提取相关数据来进行深度刻画用户及用户群体,另外爬取公共公开数据也是分析运营的常用方式。.
外部数据源:广告投放数据、爬虫数据、三方接口数据。
2、主题划分
描述:DW层分为DWD和DWS层,是数据仓库维度建模的核心,需紧绕业务过程来设计。
2.1示例:用户产品浏览主题:
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_actlog_product_view (
user_id string COMMENT '用户id',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
target_id string COMMENT '产品ID',
ct BIGINT COMMENT '产生时间'
)
2.2交易主题的交易订单明细流水表【DWD】示例:
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_orders_details (
order_id string COMMENT '订单ID',
order_status INT COMMENT '订单状态:5已收货(完成)|6投诉 7退货',
supplier_code VARCHAR (20) NOT NULL COMMENT '店铺ID',
product_code VARCHAR (20) NOT NULL COMMENT '商品ID',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
user_areacode string COMMENT '用户所在地区',
consignee_zipcode string COMMENT '收货人地址',
pay_type string COMMENT '支付类型:线上支付 10 网上银行 11 微信 12 支付宝 | 线下支 付(货到付款) 20 ',
pay_count INT COMMENT '支付次数',
product_price DECIMAL (5, 1) NOT NULL COMMENT '购买商品单价',
weighing_cost DECIMAL (2, 1) NOT NULL COMMENT '商品加权价格',
district_money DECIMAL (4, 1) NOT NULL DEFAULT 0.0 COMMENT '优惠金额',
is_activity NOT NULL DEFAULT 0 COMMENT '1:参加活动|0:没有参加活动',
order_ctime BIGINT COMMENT '创建时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dwd/order/dwd_nshop_orders_details/'
2.3中间层(对DWD层更详细的选取与聚合)
用户启动统计【MID】建表示例:
CREATE external TABLE
IF NOT EXISTS mid_nshop.mid_nshop_actlog_launch_timesegs (
user_id string COMMENT '用户id',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
launch_times string COMMENT '24bit表示24小时启动情况',
launch_count INT COMMENT '用户每天启动次数',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/mid/actlog/mid_nshop_actlog_launch_timesegs/'
2.4 ADS应用数据层
总体运营统计的流量类指标——平台统计表【ADS】建表示例:
CREATE external TABLE
IF NOT EXISTS ads_nshop.ads_nshop_platform_flow_stat (
customer_gender TINYINT NOT NULL COMMENT '性别:1男 0女',
age_range VARCHAR (10) NOT NULL COMMENT '年龄段',
customer_natives VARCHAR (10) NULL COMMENT '所在地区',
visit_avg_duration INT COMMENT '人均页面访问时长',
visit_avg_counts INT COMMENT '人均页面访问数'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/ads/operation/ads_nshop_platform_flow_stat/'