数据仓库技术及应用
一、Hive 简介
1、Hive 架构
-
UI
用户提交接口,用于用户提交查询和其它操作等。
-
Driver
接收查询的组件。该组件实现了会话句柄,并提供基于 JDBC/ODBC 接口的execute、 fetch APIs。
-
Compiler
该组件解析查询,在不同查询块和查询表达式中做语义分析,最终借助从metastore查找的表和分区元数据生成执行计划。
-
MetaStore
存储所有表、分区的结构化信息包括:列和列类型信息、读写数据所需的序列化器和反序列化器以及相关存储的hdfs文件。
-
Execution Engine
执行由Compiler生成的执行计划。执行计划是一个由stages组成的有向无环图,执行引擎管理stage之间的依赖关系,并让合适的组件执行对应的stage。
Hive 架构图
2、Hive 存储模型
-
行式存储模型:以行为单位存储数据,适合于实时查询和增量更新
-
列式存储模型:以列为单位存储模型,适合于批量查询和聚合计算
-
ORC 存储模型:Optimized Row Columnar(ORC) 是 Hadoop 中一种高效的列式存存储格式,支持压缩和索引,适合于大规模数据的存储和查询
-
Parquet 存储模型:Parquet 是一种跨平台的列式存储格式,支持压缩和高效的列操作,适合于大规模数据的存储和查询
-
Avro 存储模型:Apache Avro 是一种数据序列化系统,支持多种编程语言和数据存储格式,适合于复杂数据结构的存储和查询
3、Hive 的基本数据类型
类型 | 描述 | 示例 |
---|---|---|
BOOLEAN | true/false | TRUE |
TINYINT | 1字节有符号整数,从-128到127 | 1Y |
SMALLINT | 2字节有符号整数,从-32768到32767 | 1S |
INT | 4字节有符号整数,从-2147483648到2147483647 | 1 |
BIGINT | 8字节有符号整数,从-9223372036854775808到9223372036854775807 | 1L |
FLOAT | 4字节单精度浮点数 | 1.0 |
DOUBLE | 8字节(64位)双精度浮点数 | 1.0 |
DECIMAL | 任意精度有符号小数 | 1.0 |
STRING | 无上限可变长度字符串 | ‘a’, “a” |
VARCHAR | 可变长度字符串 | ‘a’, “a” |
CHAR | 固定长度字符串 | ‘a’, “a” |
BINARY | 字节数组 | - |
TIMESTAMP | 精度到纳秒的时间戳 | ‘2020-03-01 00:00:00’ |
DATE | 日期 | ‘2020-01-01’ |
4、HIve 的库/表操作
修改数据表表名:
ALTER TABLE table_name RENAME TO new_table_name
清空表:
truncate table table_name
5、Hive 内部表与外部表的定义
内部表(managed table):未被 external 修饰的表,也叫管理表
外部表(external table):被 external 修饰的表。
内部表被 drop 后,表的 data 和 metadata 都会被删除;
外部表被 drop 后,表的 metadata 会被删除,但是 data 不会被删除。
-
创建内部表
create table student1( id int, name string ) row format delimited fields terminated by '\t' sorted as textfile;
-
创建外部表
create external table student2( id int, name string) row format delimited fields terminated by '\t' sorted as textfile;
6、Hive 元数据
概述:Hive元数据包括hive库信息、表信息(表的属性、表的名称、表的列、分区及其属性)以及表数据所在的目录等。
Hive的元数据,默认是存储在derby中的,但是我们一般会修改其存储在关系型数据库比如MYSQL中(其可以在hive配置中修改),在关系型数据库中会有一个hive库,存放相应的表。
6.1 存储模式图
-
单用户存储模式
-
多用户存储模式
-
远程服务存储模式
7、HQL
hive 关联表方式:
例表:
-
内关联:join on
select * from jion1 join join2 on jion1.id = jion2.id;
作用:将表1和表2的字段id相同的内容 关联到一个表里。
-
左外关联:left join on
select * from jion1 left join join2 on jion1.id = jion2.id;
作用:以join左边的表为标准进行连接(即保留左边表的字段值,右边表不符合on条件的用null表示)。
-
右外关联:right join on
select * from jion1 right join join2 on jion1.id = jion2.id;
作用:以join右边的表为标准进行连接(即保留右边表的字段值,左边表不符合on条件的用null表示)。
-
全外关联:full join on
select * from jion1 full join join2 on jion1.id = jion2.id;
作用:两个表连接,表留所有字段的值,不符合on条件的用null表示。
-
左半连接
内连接的一半
-
交叉连接
笛卡尔积
7.1 排序
-
order by
对结果集进行全局排序,数据规模较大时,比较耗时
-
sort by
指出数据在每个 Reducer 内如何排序的,通常与 DISTRIBUTE BY 一起使用
-
DISTRIBUTE BY
控制 Map 输出在 Reducer 中的划分
-
CLUSTER BY
相当于 DISTRIBUTE BY 和 SORT BY