数据仓库:数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持,数据仓库是存数据的,主要是为了分析有效数据,后续会基于它产出供分析挖掘的数据,或者数据应用需要的数据,如企业的分析性报告和各类报表等。
可以理解为:面向分析的存储系统
数据库和数据仓库的区别实际讲的是OLTP和OLAP的区别
操作型处理,叫联机事务处理OLTP,也可以称为面向交易的处理系统,针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户比较关心的是响应时间、数据安全性、完整性和并大支持的用户数等。
分析性处理,叫联机分析处理OLAP。一般针对某些主题的历史数据进行分析,支持管理决策。
首先要明白,数据仓库的出现,并不是要取代数据库。
1、数据库是面向事务的设计,数据仓库是面向主题设计的。
2、数据库一般存储业务数据,数据仓库存储的一般是历史数据。
3、数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
4、数据库是为了捕获数据而设计,数据仓库是为分析数据而设计
数据仓库的分层架构:
按照数据流入流出的过程,数据仓局架构可以分为三层--源数据、数据仓库、数据应用
源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放,为后一步的数据处理做准备。
数据仓库层(DW):也称为细节层,DW层的数据应该是一致的,准确的、干净的过程,即对源系统数据进行了清洗后的数据。
数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析区需求而计算生成的数据。
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra、转化Transfer、装载Load)的过程,ETL是数据仓库的流水线。
Hive简介:
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
其本质是将SQL转换为MapReduce的任务进行计算,底层由HDFS来提供数据的存储,说白了hive可以理解为一个将SQL转换为MapReduce任务的工具,甚至更进一步可以说hive是一个MapReduce的客户端
创建表并指定字段之间的分隔符
create table if not exists stu(id int,name String) row format delimited fields terminated by '\t';
创建表并指定表文件的存放路径
create table if not exists stu(id int,name String) row format delimited fields terminated by '\t' location '/user/stu';
根据查询结果创建表(通过复制表结构和表内容创建新表)
create table stu2 as select * from stu;
根据已经存在的表结构创建表
create table stu3 like stu2;
一般情况下最好设置为外部表
外部表说明:
外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存在hdfs中,不会删掉
内部表和外部表的使用场景:
每天将手机到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到中间表、结果表使用内部表存储,数据通过select+insert进入内部表
create external table student(s_id String,s_name String) row format delimited fields terminated by '\t';
加载数据
load data local inpath 'hdfs路径' into table XXX;
加载数据并覆盖已有数据
load data local inpath 'hdfs路径' overwrite into table XXX;
从hdfs文件系统向表中加载数据(需要提前将数据上传到hdfs文件系统)
cd /export/servers/hivedatas
hdfs dfs -mkdir -p /hivedatas
hdfs dfs -put teacher.csv /hivedatas/
load path inpath '/hivedatas/teacher.csv' into table teacher;
分区表的操作:
create table score(s_id String,s_name String) partitioned by(month String) row format delimited fields terminated by '\t';
创建一个表带多个分区
create table score(s_id String,s_name String) partitioned by(year String,month String,day String) row format delimited fields terminated by '\t';
加载数据到分区表中
load data local inpath 'hdfs路径' into table XXX partition (month = '201806');
多分区表联合查询(使用union all)
select * from score where month = '201806' union all select * from score month = '201806';
查看分区
show partitions 表名;
添加一个分区
alter table score add partition(month = '201806' );
删除分区
alter table score drop partition(month = '201806' );
进行表的修复(建立表和数据文件之间的一个关系映射)
msck repair table XXX;
分桶表:
分桶,就是将数据按照指定的字段进行划分到多个文件当中去,分桶就是MR中的分区
开启Hive中的分桶操作
set hive.enforce.bucketing = true
设置Reduce的个数
set mapreduce.job.reduces=3;
创建分桶表
create table cource(c_id String,c_name String) clustered by(c_id) into 3 buckets row format delimited fields terminated by '\t';
桶表的数据加载,由于通标的数据加载通过hdfs dfs -put文件或者通过load data均不好使,只能通过insert overwrite
创建普通表,并通过nsert overwrite方式将普通标的数据通过查询的方式加载
insert overwrite table cource select * from cource_common cluster by (c_id);
常用函数
求总行数
select count(1) from score;
求分数的最大值
select max(score) from score;
求分数的最小值
select min(score) from score;
求分数的总和:
select sum(score) from score;
求分数的平均值(avg)
select avg(score) from score;
Limit语句
select * from score limit 3;
Like和RLike
%代表0个或多个字符
_代表一个字符
RLike子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式来指定匹配条件
查询所有以8开头的所有成绩
select * from score where s_score like '8%';
查询第二个数值为9的所有成绩数据
select * from score where s_score like '_9%';
查询s_id中含1的数据
select * from score where s_id rlike '[1]'; # like '%1%'
Having语句
1、having和where不同点
where针对表中列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
where后面不能与分组函数,而having后面可以使用分组函数
habing只用于group by 分组统计语句
排序
全局排序
ORDER BY 全局排序,一个reduce
1、使用ORDER BY 子句排序ASC,升序是默认,DESC是降序
2、ORDER BY 子句在SELECT语句的结尾
分区排序
Distribute By:类似MR中的partition,进行分区,结合sorted by 使用
注意:Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前
例如:先按照学生id进行分区,再按照学生成绩进行排序
1、设置reduce的个数,将我们对应的s_id划分到对应的reduce当中去
set mapreduce.job.reduces = 7;
通过distribute by 进行数据的分区
insert overwrite local directory '/export/servers/hivedatas/sort' select * from source distribute by s_id sort by s_score
自定义函数:
根据用户自定义函数类别分为以下三种:
UDF:一进一出
UDAF:聚集函数,多进一出
类似于:count/max/min
UDTF:一进多出
使用自定义UDF函数:
自定义类继承UDF,并且重写evaluate方法,之后打包生成jar包
上传到apache-hive的安装包的lib目录下
然后执行以下命令
add jar /apache-hive-2.7.5-bin/lib/my_udf.jar;
设置函数与我们的自定义函数关联
create temporary function my_udf as 'my_udf类所在的全路径类名'
使用: select my_udf('hello world'); =>就会打印出你自定义的函数内容了