Hive 基本概念
Hive 简介
官方介绍
Apache Hive™ 数据仓库软件有助于使用 SQL 读取、编写和管理驻留在分布式存储中的大型数据集。
可以将结构投影到已存储的数据中。提供了命令行工具和 JDBC 驱动程序以将用户连接到 Hive。
通俗理解
Hive 就是在 Hadoop 上架了一层 SQL 接口,可以将 SQL 翻译成 MapReduce 去 Hadoop 上执行,这样就使得
数据开发和分析人员很方便的使用 SQL 来完成海量数据的统计和分析,而不必使用编程语言开 MapReduce 那么麻烦。
Hive 数据类型
正常数据类型
1 | # 整型,4个字节 |
复杂数据类型
1 | # 数组,相同类型元素的数组 array<String> |
Hive 应用场景
Hive 适用于离线数据的分析,操作的是通用格式的(如通用的日志文件)、被 Hadoop
管理的数据文件,它支持类 sql,比编写 MapReduce 的 java 代码来的更加方便,
它的定位是数据仓库,存储和分析历史数据。
Hive 安装与配置
安装前的准备
1 | 将 Hive 相关软件下的文件或文件夹均拷贝到 /home/centos 下 |
安装 MySQL
1 | # 0.说明 |
安装 Hive
1 | # 1.解压 |
体验 Hive
1 | # 输入 hive 进入命令行 |
启动 Hive 的顺序
- 启动 ZooKeeper
1 | xzk.sh start |
xzk.sh
脚本内容
- 启动 Hadoop(HDFS+MR)
1 | start-all.sh |
- 启动 Hive
1 | hive |
Hive 2代服务
Hive 的 jdbc 接口,用户可以连接此端口来连接 Hive 服务器
1 | # 先启动 |
Hive 与 Hadoop 的关系
关系
- Hive构建在 Hadoop 之上
- HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的
- 所有的数据都是存储在 HDFS 中
查询计划被转化为 MapReduce 任务,在 Hadoop 中执行
(有些查询没有 MR 任务,如:select * from table)
Hadoop 和 Hive 都是用 UTF-8 编码的
Hive 语句和 MR 执行过程对应
Hive 与传统数据库对比
对比1
SQL => struct query language
HQL => hive query language 类sql,和sql语句差别不大
no sql => not only sql 不仅仅是sql,和sql语句差距较大
对比2
传统数据库 OLTP
online transaction process 在线事务处理
1 | # 事务: |
Hive
OLAP:online analyze process 在线分析处理
1 | Hive数据仓库:反范式设计,允许甚至推荐冗余 |
Hive 的数据存储机制
Hive 中的表为文件夹
实际数据为文件
Hive 基本操作
Hive 建表指定分隔符
Demo
1 | # 创建表 user2 ,指定行格式化分隔符中的字段分隔符为制表位 \t |
分隔符类型
1 | # 字段分隔符 |
Hive 插入数据
Hive 插入数据的方法
Hive 插入数据不是使用 insert,而是 load
Hive 插入数据的顺序
1 | # 1.先定义好表结构 |
插入复杂类型数据 insert
1 | # 设置显示表头,临时修改,永久修改需要修改配置文件 hive-site.xml |
load命令详解
前提: 先建表
1 | create table duowan(id int, name string, pass string, mail string, nickname string) |
使用 load
1 | # 1.load 本地数据,相当于上传或者复制,源文件不变 |
JDBC 连接 Hive
报错
1 | # 错误 |
本地 navicat 连接服务器中的 MySQL
主要目的是查看 Hive 的元数据
报错
1 | # 错误 |
在 Hive 中执行 shell 语句
1 | # 在hive命令行执行shell语句 |
在 Hive 中执行 HDFS 语句
1 | # 在hive命令行执行HDFS语句 |
Hive 中的 DDL 操作
说明
DDL(Data Definition Languages)语句:数据定义语言
这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。
常用的语句关键字主要包括 create、drop、alter等。
alter
1 | # 1.修改表名 |
实现高效的 JOIN 查询
说明
在 Hive 中如何实现高效的 JOIN 查询
join 最好将大表放在右侧,避免内存溢出异常
普通 join 操作
说明
1 | # 返回行数 a ∩ b |
例子
1 | # 1.创建 customer 表 |
高效的 join 查询
map join
说明
1 | # 1.结构 |
common join
说明
1 | # 1.说明 |
测试
1 | # 1.使用以下两个表进行测试 |
Hive 的内置函数应用
基本操作
1 | # 查看函数 |
时间函数
1 | # 显示当前数据库 |
String函数
1 | # 切分,按空格切分成 array 数组 ["hello","word"] |
条件语句
1 | # if |
explode
1 | # 1.描述 |
split
1 | # 1.描述 |
substr
1 | # 1.描述 |
Hive shell的高级使用方式
计算 Top 10
1 | # 创建表 |
WordCount
思路1
1 | # 1.将 array 类型成员分隔符指定为空格 |
实现1
1 | # 1.创建表wc |
思路2
1 | # 1.建立一个表,只有一行字符串 |
实现2
1 | # 1.创建表wc2 |
Hive 常用参数配置
Hive 使用 Hadoop 本地模式
1 | # 1.让 Hive 自动使用 Hadoop 的本地模式运行作业,提升处理性能 |
Hive 自定义函数和Transform的使用技巧
1 |
|
Hive UDF/UDAF开发实例
Hive 执行过程分析及优化策略
Hive 优化策略
性能工具
explain
对 Hive 语句进行解析,解析为 MR 的各个阶段
analyze
对表进行分析,得出 SQL 语句的优化策略和基本统计
设计优化
分区表
说明
partition,是一个字段,是文件夹
前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,
搜索出所需的数据,性能极差,partition 就是为了避免全表扫描
1 | # 1.创建非分区表 user_nopar |
分桶表
避免分区文件夹过多
索引
数据文件优化
文件格式
压缩
存储