【Hive笔记】 一、准备知识
简介
官方描述: The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.
Hive
常用于离线计算, 主要特点:
Hive
是数据仓库, 依赖于Hadoop
框架, 原生支持分布式, 可以将结构化数据文件映射成表, 从而提供类SQL
查询(HSQL
).- 灵活扩展, 支持自定义用户函数(UDF等), 支持多种存储方式(ORC/TEXT)
- 统一的元数据管理, 可与 sparksql 等共享数据
Hive 架构

command-line shell
&thrift/jdbc
: 提供主要两种操作方式, 前者通过命令行访问, 后者通过thrift
协议按照标准的JDBC
方式编程实现.Metastore
: 元数据(Hive
表名称、表结构等统称) 存储于数据库(默认内置 derby, 单实例无法并发, 实际场景均为 Mysql)中.
HQL 的执行流程
Hive
在执行一条 HQL
的时候,
会经过以下步骤:
- 语法解析:
Antlr
定义SQL
的语法规则, 完成SQL
词法, 语法解析, 将SQL
转化为抽象语法树AST Tree
; - 语义解析: 遍历
AST Tree
, 抽象出查询的基本组成单元QueryBlock;
- 生成逻辑执行计划: 遍历
QueryBlock
, 翻译为执行操作树OperatorTree;
- 优化逻辑执行计划: 逻辑层优化器进行
OperatorTree
变换, 合并不必要的ReduceSinkOperator
, 减少shuffle
数据量; - 生成物理执行计划: 遍历
OperatorTree
, 翻译为MapReduce
任务; - 优化物理执行计划: 物理层优化器进行
MapReduce
任务的变换, 生成最终的执行计划.
数据类型
基础数据类型
大类 | 类型 |
---|---|
Integers(整型) | TINYINT—1 字节的有符号整数 SMALLINT—2 字节的有符号整数 INT—4 字节的有符号整数 BIGINT—8 字节的有符号整数 |
Boolean(布尔型) | BOOLEAN—TRUE/FALSE |
Floating point numbers(浮点型) | FLOAT— 单精度浮点型 DOUBLE—双精度浮点型 |
Fixed point numbers(定点数) | DECIMAL—用户自定义精度定点数, 比如 DECIMAL(7,2) |
String types(字符串) | STRING—指定字符集的字符序列 VARCHAR—具有最大长度限制的字符序列 CHAR—固定长度的字符序列 |
Date and time types(日期时间类型) | TIMESTAMP — 时间戳 TIMESTAMP WITH LOCAL TIME ZONE — 时间戳, 纳秒精度 DATE—日期类型 |
Binary types(二进制类型) | BINARY—字节序列 |
TIMESTAMP
和TIMESTAMP WITH LOCAL TIME ZONE
的区别如下:
TIMESTAMP WITH LOCAL TIME ZONE
: 用户提交时间给数据库时, 会被转换成数据库所在的时区来保存.查询时则按照查询客户端的不同, 转换为查询客户端所在时区的时间.TIMESTAMP
: 提交什么时间就保存什么时间, 查询时也不做任何转换.
隐式转换
数据类型具体可从参考官方文档LanguageManual Types, 其中隐形转换部分如下表, 但隐形转换在实际业务中并不可取, 存在坑,
Spark 3.X
已经默认不允许隐形转换写表, 建议采用CAST
显式转换.
void | boolean | tinyint | smallint | int | bigint | float | double | decimal | string | varchar | timestamp | date | binary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
void to | true | true | true | true | true | true | true | true | true | true | true | true | true | true |
boolean to | false | true | false | false | false | false | false | false | false | false | false | false | false | false |
tinyint to | false | false | true | true | true | true | true | true | true | true | true | false | false | false |
smallint to | false | false | false | true | true | true | true | true | true | true | true | false | false | false |
int to | false | false | false | false | true | true | true | true | true | true | true | false | false | false |
bigint to | false | false | false | false | false | true | true | true | true | true | true | false | false | false |
float to | false | false | false | false | false | false | true | true | true | true | true | false | false | false |
double to | false | false | false | false | false | false | false | true | true | true | true | false | false | false |
decimal to | false | false | false | false | false | false | false | false | true | true | true | false | false | false |
string to | false | false | false | false | false | false | false | true | true | true | true | false | false | false |
varchar to | false | false | false | false | false | false | false | true | true | true | true | false | false | false |
timestamp to | false | false | false | false | false | false | false | false | false | true | true | true | false | false |
date to | false | false | false | false | false | false | false | false | false | true | true | false | true | false |
binary to | false | false | false | false | false | false | false | false | false | false | false | false | false | true |
复杂数据类型
类型 | 描述 | 示例 |
---|---|---|
STRUCT | 类似于对象, 是字段的集合,
字段的类型可以不同, 可以使用 名称.字段名 方式进行访问 |
STRUCT ('xiaoming', 12 , '2018-12-12') |
MAP | 键值对的集合, 可以使用 名称[key] 的方式访问对应的值 | map('a', 1, 'b', 2) |
ARRAY | 数组是一组具有相同类型和名称的变量的集合, 可以使用 名称[index] 访问对应的值 | ARRAY('a', 'b', 'c', 'd') |
存储方式
内容分割
内容分隔符用于数据内容的存储分割, 如常见的 CSV
则是以
,
逗号进行分割, 但通常文本也存在这些字符,
则会导致字段错位等情况. 因此通常推荐如下的不可见字符.
推荐分隔符 | 描述 |
---|---|
^A (Ctrl+A) | 分割字段 (列), 在 CREATE TABLE 语句中也可以使用八进制编码
\001 来表示 |
^B | 用于分割 ARRAY 或者 STRUCT 中的元素, 或者用于 MAP
中键值对之间的分割, 在 CREATE TABLE 语句中也可以使用八进制编码
\002 表示 |
^C | 用于 MAP 中键和值之间的分割, 在 CREATE TABLE
语句中也可以使用八进制编码 \003 表示 |
存储格式
格式 | 说明 |
---|---|
TextFile | 存储为纯文本文件. 这是 Hive
默认的文件存储格式.这种存储方式数据不做压缩, 磁盘开销大,
数据解析开销大. |
SequenceFile | Hive 中的
SequenceFile 继承自 Hadoop API 的
SequenceFile (key->value形式) |
RCFile | RCFile 文件格式是 FaceBook
开源的一种 Hive 的文件存储格式, 首先将表分为几个行组,
对每个行组内的数据按列存储, 每一列的数据都是分开存储. |
ORC Files | ORC 是在一定程度上扩展了 RCFile, 是对 RCFile 的优化. |
Avro Files | Avro 是一个数据序列化系统,
设计用于支持大批量数据交换的应用.它的主要特点有: 支持二进制序列化方式,
可以便捷, 快速地处理大量数据;动态语言友好, Avro
提供的机制使动态语言可以方便地处理 Avro 数据. |
Parquet | Parquet 是基于 Dremel 的数据模型和算法实现的, 面向分析型业务的列式存储格式.它通过按列进行高效压缩和特殊的编码技术, 从而在降低存储空间的同时提高了 IO 效率. |
存储形式
内部表 | 外部表 | |
---|---|---|
导入数据 | 在导入数据到内部表, 内部表将数据移动到自己的数据仓库目录下, 数据的生命周期由 Hive 来进行管理 | 外部表不会将数据移动到自己的数据仓库目录下, 只是在元数据中存储了数据的位置 |
删除表 | 删除元数据(metadata)和文件 | 只删除元数据(metadata) |
建议: 一般在业务中常常使用外部表, 从而保证研发人员在误操作(
drop
), 无法恢复历史数据.
参考资料
【Hive笔记】 一、准备知识
https://www.windism.cn/3254898048.html