Hive数据仓库
Hive是一个构建在Hadoop之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类SQL查询功能,用户查询的SQL语句会被转化为MapReduce作业,然后提交到Hadoop上云运行。
- 特点:
简单、容易上手,精通sql编程的人而已很好的进行大数据分析
灵活性高,可以自定义用户函数和存储格式。
为超大的数据集设计的计算和存储能力,集群扩展容易
统一的元数据管理,可与presto/impala/sparksql等共享数据
执行延迟高,不适合做数据的实时处理,但适合做海量数据的离线处理
Hive的体系结构
1.command-line & thrift/JDBC
command-line shell :通过hive命令行方式操作数据
通过thrift协议的按照标准的jdbc的方式操作数据
- Metastore
在Hive中,表名、表结构、字段名、字段类型、表的分隔符等统一被成为元数据。所有的元数据默认存储在Hive内置的derby数据库中。但由于derby只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中通常使用Mysql代替derby
Hive进行的是统一的元数据管理,就是说在Hive上创建了一张表,然后在sparksql、presto、impala中都可以直接使用,它们会在MetaStore中获取统一的元数据信息,同样的在sparksql等创建一张表,Hive也可以直接使用。- HQL的执行流程
Hive在执行一条HQL的时候,会经过以下步骤
(1)语法解析:Antlr定义SQL的语法细则,完成SQL词法,语法解析,将SQL转换为抽象树AST Tree
(2) 语义解析:遍历AST Tree,抽象出查询的基本组成单元QueryBlock
(3) 生成逻辑执行计划:遍历QueryBlock,翻译为执行操作树OperatorTree。
(4) 优化逻辑执行计划: 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量。
(5) 生成物理执行计划:遍历OperatorTree,翻译为Mapreduce任务
(6) 优化物理执行计划: 物理层优化器进行MapReduce任务的变换,生成最终的执行计划。
Hive的基本数据类型
- Integers 整型 TINYINT-SMALLINT-INT-BIGINT
- Boolean 布尔型 BOOLEAN=TRUE/FALSE
- Floating point numbers(浮点型)FLOAT-DOUBLE
- Fixed point numbers (定点数) DECIMAL
- String types(字符串)STRING-VARCHAR-CHAR
- Date and Time types(日期时间类型)TIMESTAMP-DATE-TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE:用户提交时间给数据库时,会被转换成数据库所在的时区来保存。查询时则按照查询客户端的不同,转换为查询客户端所在时区的时间。 TIMESTAMP :提交什么时间就保存什么时间,查询时也不做任何转换。
- Binary types (二进制类型)BINARY
隐式转换
Hive中基本数据按照以下类型进行转换,子类型到祖先类型允许隐式转换。
复杂类型
struct 类似于对象,是字段的集合,字段的类型可以不同,可以使用名称.字段名方式进行访问
map键值对的集合,可以使用名称[key]的方式访问对应的值
Array 数组是一组具有相同类型和名称变量的集合可以使用名称[index]访问对应的值
内容格式
Hive 默认使用了几个平时很少出现的字符,这些字符一般不会作为内容出现在文件中。Hive 默认的行和列分隔符如下表所示
\n 对于文本文件来说,每行是一条记录,所以可以使用换行符来分割记录
^A (Ctrl+A) 分割字段 (列),在 CREATE TABLE 语句中也可以使用八进制编码 \001 来表示
^B 用于分割 ARRAY 或者 STRUCT 中的元素,或者用于 MAP 中键值对之间的分割,
在 CREATE TABLE 语句中也可以使用八进制编码 \002 表示
^C 用于 MAP 中键和值之间的分割,在 CREATE TABLE 语句中也可以使用八进制编码 \003 表示
存储格式
Hive会在HDFS为每个数据库上创建一个目录,数据库中的表是该目录的子目录,表中的数据会以文件的形式存储在对应的目录下。Hive支持以下几种文件存储格式
- TextFile 存储为纯文本文件。 这是 Hive 默认的文件存储格式。这种存储方式数据不做压缩,磁盘开销大,数据解析开销大。
- SequenceFile Hadoop API提供的一种二进制文件,它将数据以key,value形式序列化到文件中。
- RCFILE 文件格式是 FaceBook 开源的一种 Hive 的文件存储格式,首先将表分为几个行组,对每个行组内的数据按列存储,每一列的数据都是分开存储
- ORCFILE ORC 是在一定程度上扩展了 RCFile,是对 RCFile 的优化。
- Avro 是一个数据序列化系统,设计用于支持大批量数据交换的应用。
- Parquet 是基于 Dremel 的数据模型和算法实现的,面向分析型业务的列式存储格式。
指定存储格式
1.通常在创建表的时候使用STORED AS参数指定
CREATE TABLE page_view(viewTime INT, userid BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' COLLECTION ITEMS TERMINATED BY '\002' MAP KEYS TERMINATED BY '\003' STORED AS SEQUENCEFILE; --TEXTFILE SEQUENCE FILE /OCRFILE /OCRFILE ORC/AVRO/PARQUET
内部表和外部表
内部表又叫做管理表,创建表时不做任何指定,默认创建的就是内部表。想要创建外部表,则需要使用External进行修饰。
内部表数据存储的位置由: hive.metastore.warehouse.dir 参数指定,默认情况下表的数据存储在 HDFS 的 /user/hive/warehouse/数据库名.db/表名/ 目录下
内部表导入数据:在导入数据到内部表,内部表将数据移动到自己的数据仓库目录下,数据的生命周期由 Hive 来进行管理。
内部表删除表: 删除元数据(metadata)和文件
外部表存储位置由创建表时Location参数指定
外部表不会移动到自己的仓库目录下,只是元数据中存储了位置
外部表删除表:只删除元数据