数据仓库(Data Warehouse,DW/DWH)是一个很大的数据存储集合,出于企业的分析性报告和决策支持目的而创建,对多样的业务数据进行筛选与整合。它为企业提供一定的BI(商业智能)能力,指导业务流程改进、监视时间、成本、质量以及控制。
数据仓库的输入方是各种各样的数据源,最终的输出用于企业的数据分析、数据挖掘、数据报表等方向。
数据仓库面向分析,平时的Mysql数据库主要面向业务。
数据仓库是专门用来进行数据分析的,它可以是Mysql、Oracle等数据库,但是在大数据中常用到的是Hive。
数据仓库是面向主题的、集成的、稳定的和时变的数据集合,用以支持管理决策。
(1)主题性
不同于传统数据库对应于某一个或多个项目,数据仓库根据使用者实际需求,将不同数据源的数据在一个较高的抽象层次上做整合,所有数据都围绕某一主题来组织。
比如对于城市,“天气湿度分析”就是一个主题。对于淘宝,“用户点击行为分析”就是一个主题。
(2)集成性
数据仓库中存储的数据是来源于多个数据源的集成,原始数据来自不同的数据源,存储方式各不相同。要整合成为最终的数据集合,需要从数据源经过一系列抽取、清洗、转换的过程。
(3)稳定性
数据仓库中保存的数据是一系列历史快照,不允许被修改。用户只能通过分析工具进行查询和分析。这里说明一点,数据仓库基本上是不许允许用户进行修改,删除操作的。大多数的场景是用来查询分析数据。
(4)时变性
数据仓库会定期接收新的集成数据,反应出最新的数据变化。这和稳定特点并不矛盾。
(1)数据库
数据库是面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理,也被称为联机事务处理 OLTP(On-Line Transaction Processing)。
(2)数据仓库
数据仓库一般针对某些主题的历史数据进行分析,支持管理决策,又被称为联机分析处理 OLAP(On-Line Analytical Processing)。首先要明白,数据仓库的出现,并不是要取代数据库。
(3)两者区别
(4)数据仓库分层架构
按照数据流入流出的过程,数据仓库架构可分为三层——源数据、数据仓库、数据应用。
数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。
ETL(Extract-Transform-Load):数据的抽取、数据的转换、数据的加载。将杂乱的数据转换为可以处理分析的数据。ETL是将业务系统的数据经过抽取、清洗、转换之后加载到数据仓库的过程,目的是将企业中分散、零乱、标准不统一的数据整合到一起。
ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。
insert into table1 from select * from table2;
(1)可视化ETL平台——Kettle
Kettle(PDI)是一款国外开源ETL工具,Java编写,可在多平台运行,允许管理来自不同数据库的数据,并提供了一个图形化的用户环境。使用Kettle从众多数据库中抽取有用的数据放到数仓中。
(2)数据分析工具——Superset
Superset是一款开源的现代化企业级BI,是一款开源的数据分析可视化工具,支持多种数据源,图表类型多。用于对数仓中的数据进行分析及图形化显示。
基本步骤:
Hadoop是一个开源框架,它的核心组件有:
广义上来说,Hadoop通常是指Hadoop生态圈:
重点框架:Kafka、Spark、Flink、Hive、Hbase、Zookeeper、Yarn、MapReduce、HDFS
版本:
Hadoop发行版本分为开源社区版和商业版:
(2)数据计算核心模块——Yarn:
(3)Hadoop2.x架构模型——MapReduce
(3)Hadoop模块之间的关系
(1)HADOOP集群简介
HADOOP集群包含:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起。
(2)集群搭建方式
单机模式(Standalone mode):
群集模式(Cluster mode):
(1)概述
单机容量往往无法存储大量数据,大数据需要跨机器存储。统一管理分布在集群上的文件系统称为分布式文件系统 。
HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目. Hadoop 非常适于存储大型数据 (比如 TB 和 PB), 其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件,
并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。
分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。
(2)HDFS的特点
HDFS文件系统可存储超大文件,时效性稍差。
HDFS具有硬件故障检测和自动快速恢复功能。
HDFS为数据存储提供很强的扩展能力。
HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改。
HDFS可在普通廉价的机器上运行。
(3)HDFS的架构
Client:
NameNode:
DataNode
Secondary NameNode
(4)HDFS的副本机制
Shell命令介绍:
Hadoop提供了文件系统的shell命令使用格式如下:
hadoop fs
#既可以操作HDFS,也可以操作本地系统。hdfs dfs
#只能操作HDFS系统。(1)ls 显示文件列表
格式: hadoop fs -ls URI
hadoop fs -ls /
#显示文件列表
hadoop fs –ls -R /
#递归显示文件列表
(2)mkdir 创建目录
格式 : hadoop fs –mkdir [-p]
hadoop fs -mkdir /dir1
#创建目录
hadoop fs -mkdir -p /aaa/bbb/ccc
#递归创建目录
(3)put 上传文件
格式 : hadoop fs -put
作用 :
将单个的源文件或者多个源文件srcs从本地文件系统上传到目标文件系统中。
hadoop fs -put /root/1.txt /dir1
#上传文件
hadoop fs –put /root/dir2 /
#上传目录
(4)get 文件拷贝
格式 : hadoop fs -get
作用:将HDFS文件拷贝到本地文件系统。
hadoop fs -get /initial-setup-ks.cfg /opt
#拷贝文件
(5)mv 移动文件
格式 :hadoop fs -mv
作用: 将hdfs上的文件从原路径src移动到目标路径dst,该命令不能跨文件系统。
hadoop fs -mv /dir1/1.txt /dir2
#HDFS中移动文件
(6)rm 删除文件
格式: hadoop fs -rm [-r] [-skipTrash] URI [URI 。。。]
作用:
hadoop fs -rm /initial-setup-ks.cfg
#删除文件
hadoop fs -rm -r /dir2
#删除目录
(7)cp 复制文件
格式: hadoop fs -cp
作用: 将文件拷贝到目标路径中
hadoop fs -cp /dir1/1.txt /dir2
#复制文件
(8)cat查看文件
格式: hadoop fs -cat
作用:将参数所指示的文件内容输出到控制台
hadoop fs -cat /dir1/1.txt
#查看文件
实际生产环境当中,hadoop的环境搭建完成之后,第一件事情就是进行压力测试,测试我们的集群的读取和写入速度,这些操作被称为基准测试。
(1)写入速度测试
向HDFS文件系统中写入数据,10个文件,每个文件10MB,文件存放到/benchmarks/TestDFSIO中。
hadoop jar /export/server/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -write -nrFiles 10 -fileSize 10MB
(2)读取速度测试
在HDFS文件系统中读入10个文件,每个文件10M
hadoop jar /export/server/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -read -nrFiles 10 -fileSize 10MB
(3)清除测试数据
hadoop jar /export/server/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -clean
(1)客户端(写SQL语句):
(2)元数据Metastore:
(3)驱动器Driver(解析和优化SQL)
(4)存储和执行:
注意:
hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析。
(1)MapReduce
Hive数仓和传统关系型数据库类似,管理数仓数据也是通过该数据库和表。
(1)创建数据库-默认方式
create database if not exists myhive;
show databases; #查看所有数据库
注意:
hive的数据库置默认存放在/user/hive/warehouse目录。
(2)创建数据库-指定存储路径
create database myhive2 location '/myhive2’;
show databases; #查看所有数据库
注意:
location :用来指定数据库的存放目录
(3)查看数据库详细信息
desc database myhive;
(4)删除数据库
删除一个空数据库,如果数据库下面有数据表,那么就会报错:
drop database myhive;
强制删除数据库,包含数据库下面的表一起删除:
drop database myhive2 cascade;
一般建表后缀添加:
clustered by (cust_id) into 2 buckets --分桶 开启事务,必须进行分桶
stored as orc --存储方式
tblproperties ('transactional'='true'); --开启事务
未被external修饰的是内部表(managed table管理表),内部表数据存储位置由hive.metastore.warehouse.dir
参数决定(默认:/user/hive/warehouse),删除内部表会直接删除元数据(metadata)及存储数据,因此内部表不适合和其他工具共享数据。
(1)建表:
create database myhive;
use myhive;
create table stu(id int,name string);
select * from stu;
注意:
创建表之后,Hive会在对应的数据库文件夹下创建对应的表目录。
(2)创建表并指定字段之间的分隔符:
(3)根据查询结果创建表:
create table stu3 as select * from stu2;
(4)根据已经存在的表结构创建表:
create table stu4 like stu2;
(5)查询表的类型:
desc stu; #查看表结构基本信息
desc formatted stu; #查看表结构详细信息
(6)删除表:
drop table stu2;
注意:
查看数据库和HDFS,发现删除内部表之后,所有的内容全部删除。
(5)Hive内部表操作-数据添加:
方式1-直接插入数据:
use mytest; #选择数据库
create table stu(id int,name string); #创建表
#向表中插入数据
insert into stu values(1,'zhangsan’);
insert into stu values(2,'lisi');
select * from stu; #查询数据
注意:
该方式每次插入都会在表目录中生成对应的数据文件,每insert一次都会生成一个文件(insert的内容),不推荐使用。
方式2-load数据加载:
Load命令用于将外部数据加载到Hive表中。
示例——本地加载:
#创建表,同时指定文件的分隔符
create table if not exists stu2(id int ,name string)
row format delimited fields terminated by '\t’ ;
#向表加载数据
load data local inpath '/export/data/hivedatas/stu.txt' into table stu2;
示例——HDFS加载:
#创建表,同时指定文件的分隔符
create table if not exists stu3(id int ,name string)
row format delimited fields terminated by '\t’ ;
#向表加载数据
hadoop fs -mkdir -p /hivedatas
cd /export/data/hivedatas
hadoop fs –put stu.txt /hivedatas/
load data inpath '/hivedatas/stu.txt' into table stu3;
(6)Hive内部表特点:
/user/hive/warehouse/databasename.db/tablename/
目录。(7)元数据:
external
关键字创建外部表,外部表对应的文件存储在location指定的hdfs目录下,向该目录添加新文件的同时,该表也会读取到该文件(当然文件格式必须跟表定义的一致)。(1)数据装载命令load:
Load命令用于将外部数据加载到Hive表中。
创建老师与学生表外部表,并向表中加载数据:
源数据:
创建老师表:
创建学生表:
从本地文件系统向表中加载数据:
加载数据并覆盖已有数据:
(2)从hdfs文件系统向表中加载数据:
其实就是一个移动文件的操作
#需要提前将数据上传到hdfs文件系统
hadoop fs -mkdir -p /hivedatas
cd /export/data/hivedatas
hadoop fs -put teacher.csv /hivedatas/
load data inpath '/hivedatas/teacher.csv' into table teacher;
注意:
如果删掉teacher表,hdfs的数据仍然存在,并且重新创建表之后,表中就直接存在数据了,因为我们的student表使用的是外部表,drop table之后,表当中的数据依然保留在hdfs中。
(1)Array类型
Array是数组类型,Array中存放相同类型的数据。
源数据:
说明:name与locations之间制表符分隔,locations中元素之间逗号分隔。
建表语句:
(2)map类型
map就是描述key-value数据。
源数据:
说明:字段与字段分隔符: “,”;需要map字段之间的分隔符:“#”;map内部k-v分隔符:“:”
建表语句:
导入数据:
常用查询:
(3)struct类型
源数据:
说明:字段之间#分割,第二个字段之间冒号分割
建表语句:
导入数据:
常用查询:
查询表的类型
desc formatted student;#查看是内部表还是外部表
修改外部表student为外内部表:
alter table student set tblproperties('EXTERNAL'='FALSE');
修改内部表student为哇外部表:
alter table student set tblproperties('EXTERNAL'='TRUE');
注意:
(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!
(1)创建一级分区表:
数据加载:
(2)创建多级分区表:
数据加载:
多分区联合查询使用union all来实现:
查看分区:
添加一个分区:
同时添加多个分区:
删除分区:
注意:
添加分区之后就可以在hdfs文件系统当中看到表下面多了一个文件夹。
Apache Zeppelin是一款基于Web交互式框架,支持多种语言,如Scala,SparkSQL, Markdown ,SQL,Shell和Python等。Zeppelin提供了数据分析、数据可视化等功能。
我们可以使用Zeppelin来连接到Spark SQL的Thrift Server,这样我们可以以更直观的方式来查看Hive中的数据。而且Zeppelin也可以以图表的方式展示数据。
分桶就是将数据划分到不同的文件,其实就是MapReduce的分区。
将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去。
(1)Hive查询操作-聚合函数:
SparkSQL中提供的聚合函数可以用来统计、求和、求最值等等。
(5)Hive查询操作-Having语句:
HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。
(6)Hive查询操作-排序:
排序关键字是order by ,用于根据指定的列对结果集进行排序。在排序时,我们可以指定排序顺序,asc为升序(默认),desc为降序。
(7)Hive查询操作-limit语句:
limit子句用于限制查询结果返回的数量。
#查询3条数据
select * from student limit 3;
(8)Hive查询操作-多表查询:
内连接查询
隐式内连接:
select * from A,B where 条件;
显示内连接:
select * from A inner join B on 条件;
外连接查询
左外连接:left outer join
select * from A left outer join B on 条件;
右外连接:right outer join
select * from A right outer join B on 条件;
(9)Hive查询操作-子查询:
查询允许把一个查询嵌套在另一个查询当中,其实就是select的嵌套
将查询结果当成一个值。
#查询成绩最高学生的sid
select sid from score where sscore = (select max(sscore) from score);
将查询结果当成一张表
select sid from score a,
(select max(sscore) max_score from score) b
where a.sscore = b.max_score;
在SparkSQL中提供了很多的内置函数(内嵌函数),包括聚合函数、数学函数,字符串函数、转换函数,日期函数,条件函数,表生成函数等等。
(2)字符串函数:
(3)日期函数:
(4)条件判断函数:
(5)行转列操作:
行转列是指多行数据转换为一个列的字段。
Hive行转列用到的函数:
row_number,rank,dense_rank:
这三个函数用于数据排名,也可以用于分组排名。
sum,avg,min,max: