【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 架构

图一: Hive 架构
  • command-line shell & thrift/jdbc: 提供主要两种操作方式, 前者通过命令行访问, 后者通过 thrift 协议按照标准的 JDBC 方式编程实现.
  • Metastore: 元数据(Hive 表名称、表结构等统称) 存储于数据库(默认内置 derby, 单实例无法并发, 实际场景均为 Mysql)中.

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 任务的变换, 生成最终的执行计划.

数据类型

基础数据类型

大类 类型
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—字节序列

TIMESTAMPTIMESTAMP 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 APISequenceFile(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
作者
windism
发布于
2022年2月16日
许可协议