一、数据仓库
1、概念
数据仓库之父比尔·恩门(Bill Inmon)在1991年出版的“Building the Data Warehouse”(《建立数据仓库》)一书中所提出的定义被广泛接受——数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、非易失性(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
2、主要特征
①面向主题
操作型处理(传统数据)对数据的划分并不适用于决策分析。而基于主题组织的数据则不同,它们被划分为各自独立的领域,每个领域有各自的逻辑内涵但互不交叉,在抽象层次上对数据进行完整、一致和准确的描述。
②集成性
对分散、独立、异构的数据库数据进行抽取、清理、转换和汇总便得到了数据仓库的数据
③非易失性
数据仓库的数据反映的是一段相当长的时间内历史数据的内容,数据仓库中一般有大量的查询操作,但修改和删除操作很少。
④时变性
数据仓库的数据需要更新,以适应决策的需要。
3、数据仓库分层架构
数据源→ETL→数据仓库→数据应用
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程。
4、数据仓库的元数据管理
元数据(Meta Data),主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态及ETL的任务运行状态。【元数据在数据的处理中是一个非常重要的组成部分,直接影响着数据仓库的构建、使用和维护】
二、Apache Hive工具的简介
1.Hive的诞生
由于MapReduce编程十分繁琐,在大多情况下,每个MapReduce程序需要包含Mapper、Reduceer和一个Driver,之后需要打成jar包扔到集群上运行一旦业务逻辑发生了改变,可能就会带来大规模的改动代码。
数据分析等工程师等需要使用数据时,习惯于使用SQL语句进行业务处理
-》为了满足以上的需求,Hive就诞生了。
2.Hive简介
是基于Hadoop的一个数据仓库工具,可以理解为是一种特殊的hadoop客户端。提供以下两个重要功能:
①提供类SQL查询的功能语句。HQL
②将结构化的数据文件映射为一张数据库表
Hive利用HDFS存储数据,利用MapReduce查询分析语句。
Hive主要用于海量的数据的离线数据分析
3.Hive架构
3.1架构图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190828212008442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JlY29vbmVy,size_16,color_FFFFFF,t_70)
3.2Hive组件
用户接口:
元数据存储:通常存储在mysql、derby中。
解释器、编译器、优化器、执行器:
4.Hive数据模型
Hive中包含以下数据模型:
db(数据库):在hdfs中表现为hive.metastore.warehouse.dir目录下一个文件夹
table:在hdfs中表现所属db目录下一个文件夹
external table(外部表):数据存放位置可以在HDFS任意指定路径
partition(分区):在hdfs中表现为table目录下的子目录
bucket(桶):在hdfs中表现为同一个表目录下根据hash散列之后的多个文件
三、Hive的安装部署(cdh-1.1.0)
1.环境准备
提前安装JDK和hadoop。如果需要使用外部数据库如mysql数据库存储元数据,也需要安装mysql。
2.重要组件的介绍与配置
2.1
①metadata:元数据。存储hive创建的database、table等元信息
②metastore:元数据服务。客户端请求获取元数据,要先连接metastore,通过metastore来连接元数据存储的数据库。
2.2 metadata的元数据存储方式设置
2.3 metastore的元数据服务的三种配置方式
2.3.1 内嵌模式
默认的,一次只能一个客户端连接,不适用于生产环境。
2.3.2 本地模式
采用外部数据库如mysql来存储元数据。
需要在conf/hive-site.xml文件中配置myql相关信息即可,数据库地址、用户名、密码、连接驱动。
2.3.3 远程模式
需要启动metastore服务,由这个服务管理元数据
2.4 客户端
2.4.1 Hive自带客户端
hive>
2.5.2 beeline客户端
需要先启动metadata服务,再单独启动hiveserver2服务
beeline>
-》注:-e 执行HQL语句;-f 执行HQL脚本
四、Hive的基本操作
1.DDL(Data Definition Language)相关介绍
1.1 DDL:数据定义语言
主要是对数据库、数据表的操作(帮助记忆:数据和表格就是对某个类型的数据进行定义存储的容器,所以称为数据定义语言);
--》》数据表的四种分类:
Ⅰ 内部表:Hive默认情况下创建。在删除表的时候,内部表的元数据和表数据会被一起删除。
Ⅱ 外部表:使用external关键字创建。实际上是创建了一个指向实际数据的路径。在删除表的时候,实际只删除表的元数据,并没有删除表中储存的数据。
Ⅲ 分区表:指在创建表时使用partition关键词指定不同的分区空间。一个表可以拥有多个分区。分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。默认的情况下按照表的最后一列进行分区。
Ⅳ 分桶表:其实是MapReduce中的分区
[分桶表](https://www.jianshu.com/p/922e2e37ae22)
1.2 常用DDL语句
【创建数据库】create database [if not exist] db_name [local 'hdfs_path'];
【创建表】三种方式:
①常规创建:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
注意:外部表
②子查询的方式创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] tb_name as select statement...;
③通过复制表结构查询
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE existing_table;
-》注:创建表可以指定分隔符 row format delimited fields terminated by ','
【修改表】
增加分区:add parttition
ALTER TABLE table_name ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808' PARTITION (dt='2008-08-09', country='us') location'/path/to/us/part080809';
删除分区:drop
ALTER TABLE table_name DROP IF EXISTS PARTITION (dt='2008-08-08', country='us');
修改分区:rename to
ALTER TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');
添加列:add | replace
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name STRING);
【查询相关操作语法】
show tables;
show partition table_name;
show functions:查看当前hive支持的所有方法。
desc formatted table_name;
2 DML(Data Manipulation Language)
DML:数据操作语言
主要对表中的数据进行的增删改查等相关操作;
【load】 创建表关联。将数据文件移动到与Hive表对应的位置的纯复制和移动操作。
LOAD DATA [LOCAL] INPATH 'filepath'[OVERWRITE]INTO
TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)];
LOCAL:如果指定local,即复制一份数据到HDFS对应的表的目录下。不指定local,Hive会直接根据filepath路径去查找文件。
【insert】主要和select共同使用,将select查询结果插入到表中。
insert overwrite table stu_buck select * from student cluster by(Sno);
【select】
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
JOIN table_other ON expr
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
-》查询语句中四个有关排序的语法说明:
Ⅰ order by 输出的全局排序。只有一个reducer
Ⅱ sort by 在进入每个reducer之前进行排序,故只有每个reduce内部排序
Ⅲ distribute by(字段)根据指定字段将不同数据分到不同reducer
Ⅳ Cluster by(字段)sort by + distribute by的功能组合。分区加排序
【truncate】删除
3. Hive join(表的关联查询操作) :与mysql语句一致
内关联inner join:两表数据交集
左关联left join:左表有的数据都会显示,右表没有的显示null
右关联right join:右表有的数据都会显示,左表没有的显示null
全关联full join:两表数据全集
笛卡尔积cross join:左表的每一行与右表每一行join
半连接semi join:原理是在Map端过滤掉一些不需要join的数据,提高mapreduce性能[半连接介绍](https://blog.csdn.net/lzm1340458776/article/details/43017425)
-》注意:Hive不支持非等值(如a.id>b.id)的连接。难以转化为MapReduce任务。
-》右关联知识为了方便人的操作,机器实际还是把右关联的两张表调换位置,实际进行的还是左关联操作
-》有限制条件的join,需要提前过滤,因为如果在join后面加上where,会以join后的结果作为where的输入,可能会产生null的情况,where便失去意义。
五、Hive的参数配置
1.参数的设定方式
1.1 配置文件:全局有效
默认配置:hive-defalut.xml
自定义配置文件:hive-site.xml
-》自定义配置文件覆盖默认配置文件
-》hive读取hadoop配置文件,但hive配置文件覆盖hadoop配置文件
1.2 命令行参数:对当前hive启动实例有效
-hiveconf
1.3 参数声明:对hive连接的session有效
在HQL中使用set关键字设置
-》注意:参数声明配置覆盖命令行配置,命令行配置覆盖配置文件配置
六、Hive中的常用函数的使用
1. 内置函数
①关系运算:大小、非空、like比较...
②逻辑运算:and、or、not...
③数值运算:
取整函数--round
取随机数--rand
④日期函数
UNIX时间转日期函数--from_unixtime
hive> select from_unixtime(1323308943,'yyyyMMdd') from dual;
日期转UNIX时间戳函数--unix_timestamp
hive> select unix_timestamp('2011-12-07 13:01:03') from dual;
日期时间转日期函数--to_date
hive> select to_date('2011-12-08 10:03:01') from dual;
2011-12-08
日期转天函数--day
hive> select day('2011-12-08 10:03:01') from dual;
8
日期增加函数--date_add
hive> select date_add('2012-12-08',10) from dual;
2012-12-18
日期减少函数--date_sub
日期比较函数--datediff
hive> select datediff('2012-12-08','2012-05-09') from dual;
213
⑤条件函数
if函数
case函数
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
⑥字符串函数
长度--length
反转--reverse
拼接--concat
指定字符拼接--concat_ws
select concat_ws("\t","my","name");
截取--substring
select substring("myname",0,2);
转大写--upper,ucase
转小写--lower,lcase
去空格--trim
正则替换--regexp_replace
正则解析--regexp_extract
URL解析--parse_url
SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'HOST');
facebook.com
json解析--get_json_object
分割--split
SELECT split('oneAtwoBthreeC', '[ABC]');
集合查找--find_in_set
SELECT find_in_set('ab','abc,b,ab,c,def');
3
2. 自定义函数分类
2.1 UDF(User-Defined-Function) 普通函数 一进一出
自定义操作步骤:
1、导入相关依赖(hive、hadoop)
2、手写java类继承UDF,重写evaluate方法
3、打成jar包上传服务器
4、jar包添加到hive的classpath
5、创建临时函数关联类名
6、在hql中使用
2.2 UDAF(User-Defined Aggregation Function) 聚合函数 多进一出
2.3 UDTF(User-Defined Table-Generating Functions)表生成函数 一进多出
3. 高阶函数特性
3.1 explode
Hive内置UDTF函数。可以将array或map转化成多列
3.2 later view侧视图
配合UDTF使用:[Lateral View介绍](https://www.alibabacloud.com/help/zh/doc-detail/87722.htm)
3.3 行列转换
多行转单列
concat_ws(1,2) 1--分隔符;2--拼接内容
collect_set(col3) 对某个字段去重汇总
collect_list()对某个字段汇总
单列转多行
3.4 reflect
支持在sql中调用java中的自带函数。如取列最大值,使用lang包下函数max
select reflect("java.lang.Math","max",col1,col2) from test_udf;
3.5 json数据解析
[hive存储、解析、处理json数据](https://www.cnblogs.com/qiaoyihang/p/8729368.html)
**4.窗口函数(OLAP/分析函数)**
窗口函数兼具分组和排序功能,可以对数据可进行实时分析处理,是hive使用中的重点。下面这篇总结很棒。
[sql窗口函数](https://blog.csdn.net/qq_41805514/article/details/81772182)
七、Hive的数据压缩
1. 压缩是为了节省文件传输时间。但是压缩率并不是越高越好。因为文件压缩的越小,压缩和解压时间就越长。hadoop中常用Snappy压缩
八、Hive的文件存储介绍
1. 行式存储和列式存储
行式存储:方便INSERT/UPDATE操作(但大数据中很少有涉及行的修改数据操作)。不方便列的查询操作。查某一列会读取一整行。压缩率较低
列式存储:每一个列都可以作为索引。提高列查询效率。压缩率较高
2. TEXTFILE格式(行式存储)
默认格式。数据不进行压缩,数据也不切分,只能单线程操作,效率较低
3. SEQUENCEFILE(行式存储)
SequenceFile的存储类似于Log文件,所不同的是Log File的每条记录的是纯文本数据,而SequenceFile的每条记录是可序列化的字符数组。
4. ORC格式(列式存储)
压缩比高
5. PARQUET格式(列式存储)
文件以二进制存储,文件中包含数据和元数据。所以Parquet文件式自解析的
6. 各个存储格式性能对比
[常见格式性能测试结果对比](https://blog.csdn.net/weixin_36714575/article/details/80091578)
九、Hive的相关性能调优
1. Fetch抓取机制
Hive中对某些情况的查询可以不必使用MapReduce计算,提高性能。修改hive.fetch.task.conversion为more;这样全局查找,字段查找,filter查找,limit查找等都不走MR,直接Fetch。
2. MapReduce本地模式
不用提交到yarn上运行,直接本地模拟环境运行
3. join数据查询优化
join优化:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统。这一实现有助于在 reduce 端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则会因为缓存浪费大量内存)。
4. group by优化
map端聚合相关设置
5. 数据倾斜问题
某一个reduce执行的任务量远大于其他的reduce的情况。
-》解决
①分区调整
②reducetask个数调整
6. 执行计划
1. explain 【extended(详细查询)】--查询语句的执行计划
2. 并行执行多个阶段
7. 严格模式
防止用户执行一些可能会产生不好结果的查询操作,如笛卡尔积
8. JVM重用机制
设置jvm重用的次数,来避免由于多个task启用多个派生jvm造成的巨大开销。