第1章 基础知识
前言
-
Hive提供了一个被称为Hive查询语言(简称HiveQL或HQL)的SQL语言,来查询存储在Hadoop集群中的数据;
-
Hive可以将大多数的查询转换为MapReduce任务;
-
Hive的缺点:
- Hadoop和HDFS的设计限制了Hive不支持记录级别的更新、插入或者删除【但可以通过查询新表或者将查询结果导入到文件中】;
- 由于Hadoop是面向批处理的,且MapReduce任务启动慢,所以Hive查询延时严重;
- Hive不支持事务;
- 因为Hive速度慢且由于Hadoop被设计用来处理大规模数据,所以Hive不适合OLTP(联机事务处理),更适合使用数据仓库应用程序进行相关的静态数据分析,维护海量数据,可以对数据进行挖掘并形成意见和报告等;
- 如果想要对大规模数据使用OLTP功能,那么应该使用NoSQL数据库(例如和Hadoop结合使用的HBase)
-
HiveQL最接近于MySQL的SQL语法;
-
Hive组成模块
- CLI:命令行界面;HWI:Hive网页界面
- 所有的命令和查询都会进入到Driver(驱动模块),通过该模块对输入进行解析编译,对需求的计算进行优化,然后按照指定的步骤执行(通常是启动多个MapReduce任务来执行);
- Hive通过一个表示“job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块
- Hive通过和JobTracker通信来初始化MapReduce任务,而不必部署在JobTracker所在的管理节点上执行
- Hive会在Metastore(元数据存储)【独立的关系型数据库】中保存表模式和其他系统元数据
第2章 基础操作
2.1 安装Hive注意点
- 因为Hive中大多数工作是使用Hadoop的job,因此所有Hive的行为都可以反映出用户使用的是哪种Hadoop运行模式,但对于Hadoop来说,不同模式之间的差异相对于部署方式更多的在于执行方式;
- 当处理小数据集时,使用本地模式执行可以使Hive执行得更快些。即使在分布式模式下执行,还是可以在
$HOME/.hiverc
文件中设置sethive.exec.mode.local.auto=true;
来触发Hive更主动地使用本地模式。执行快的原因是Hive会读取数据文件,然后自己管理MapReduce task; - 使用Hadoop时,最好每次指定的文件输入和输出路径都是文件夹(而不是文件),因为由于系统是并行性的,所以通常输入和输出目录中都有很多的文件;
- Hadoop没有提供查询大文件开始或者结尾部分信息如
-moew
、-head
、-tail
之类的子命令,但可以将cat
命令的输出通过管道传递给shell中的more
、head
或者tail
命令,例如hadoop dfs -cat wc-out/*|more
;
2.2 Hive的内部
- 在
$HIVE_HOME/lib
目录下存放JAR(Java压缩包),每个JAR文件实现Hive功能中某个特定的部分; - 在
$HIVE_HOME/bin
目录下包含可以执行各种各样Hive服务的可执行文件,包括hive命令行界面(CLI);提供使用JDBC和ODBC访问Hive、远程访问其他进程的Thrift服务;提供存储表模式信息和元数据信息的元数据服务(metastoreservice);提供远程访问Hive的Hive网页界面(HWI) - 在
$HIVE_HOME/conf
目录下存放配置Hive的配置文件,配置属性包括:元数据存储(如数据存放在哪里)、各种各样的优化和“安全控制”; - 若未将
HIVE_HOME/bin
加入到环境变量PATH
中,则使用HIVE_HOME/bin/hive
来启动CLI,否则直接输入hive即可启动; - 默认情况下,Hive使用内置的Derby SQL作为元数据服务器,但只能提供有限的、单进程的存储服务,且会在用户当前工作目录下新出一个名为
metastore_db
的目录(在启动Hive会话时由Derby创建),但若用户切换到新的工作目录时,Derby会忘记前一个目录下的元数据信息;若配置了集群,需要使用MySQL等关系型数据库(在hive-site.xml
中配置元数据存储数据库);
2.3 CLI界面
-
变量和属性:
-
--define key=value
与--hivevar key=value
等价,都可让用户在命令行自定义变量,定义后,Hive会将这些键-值对放到**hivevar
命名空间**(可读/可写)中(此功能仅在v0.8.0及其之后有),其他命名空间:命名空间 使用权限 描述 hiveconf 可读/可写 Hive相关的配置属性 system 可读/可写 Java定义的配置属性 env 只可读 Shell环境(如bash)定义的环境变量 -
Hive变量内部以Java字符串方式存储;
-
在查询中引用变量的机制:Hive先使用变量值替换掉查询的变量引用,然后将查询语句提交给查询处理器;
-
使用SET命令显式或者修改变量值;
-
-
从文件中执行Hive查询:使用
-f 文件名
执行指定文件中的一个或者多个查询语句;也可以使用source
命令来执行一个脚本文件; -
-i 文件名
:允许用户指定一个文件,当CLI启动时,Hive会自动在HOME目录下寻找名为.hiverc
的文件并自动执行该文件中的命令; -
查看操作命令历史:1、滚动上下箭头查看之前的命令
-
在CLI中执行bash shell命令:不需要推出CLI,只要在想要执行的shell命令前加上
!
并以分号结尾; -
在Hive中使用Hadoop的dfs命令:只需将hadoop命令中的关键字hadoop去掉,然后以分号结尾,例如:将
hadoop dfs -ls
改为dfs -ls /
,前者每次执行都会启动一个新的JVM实例,而后者会在同一个进程中执行这些命令; -
加注释:以
--
开头的字符串来表示注释; -
显示字段名称:在CLI敲
set hive.cli.print.header=true;
来开启“让CLI打印出字段名称”的功能
第3章 数据类型和文件格式
-
Hive的数据类型都是对Java中的接口的实现;
-
Hive不支持限制最大长度的字符数组,因为Hadoop和Hive强调优化磁盘的读和写的性能,并不关心列的值长度;
-
TIMESTAMP的值可以是整数、浮点数、字符串;
-
在一个小的数字类型数据和较大的进行比较时,Hive会隐式地将小的类型转换为较大的类型,如将FLOAT类型转为DOUBLE类型;
-
强制类型转换:
cast(s AS INT)
【s是字符串类型】; -
集合数据类型
数据类型 描述 示例 STRUCT
通过“.”来访问元素内容,例如第一个元素可以通过 字段名.first
来引用STRUCT< street:STRING,city:STRING > MAP
键值对元组集合,通过 字段名[键名]
获取值MAP<STRING,FLOAT> ARRAY
每个数组元素都有一个编号且编号从零开始 ARRAY -
文本文件数据编码
文本格式文件通常以逗号分隔值(CSV)或制表符分割值(TSV)为主,但实际情况中,用户需要对文本文件中那些不需要作为分隔符处理的逗号或者制表符格外小心。因此Hive提供了很少出现在字段值中的字符作为控制字符
分隔符 描述 \n
因为对于文本文件,每行都是一条记录 ^A(Ctrl+A)
用于分隔字段(列)【在 CREATE TABLE
语句中可以使用八进制编码‘\001’表示】^B
用于分隔 ARRARY
或者STRUCT
中的元素,或用于MAP
中键-值对之间的分隔
【在CREATE TABLE
语句中可以使用八进制编码‘\002’表示】^C
用于 MAP
中键-值对之间的分隔【在CREATE TABLE
语句中可以使用八进制编码‘\003’表示】 -
读时模式
传统数据库是写时模式,即数据在写入数据库时对模式进行检查,因为传统数据库对存储具有完全的控制力;
Hive是写时模式,即在查询的时候对数据进行验证,因为对于Hive要查询的数据,有很多方法可以对其进行创建、修改甚至损坏;
如果模式和文件内容并不匹配时,Hive通常会将那些不匹配的数据设置成null值
第4章 HiveQL:数据定义
4.1 Hive中的数据库
- Hive不支持行级插入操作、更新操作和删除操作;也不支持事务;
- Hive的数据库概念本质上仅仅是表的一个目录或者命名空间,因此在所有与数据库相关的命令中,都可以使用
SCHEMA
来代替TABLE
; - 通常会使用数据库来将生成表组织成逻辑组,而如果用户没有显式指定数据库,则使用默认的数据库—default;
- 对于在继续执行之前需要实时创建数据库的情况,可以采用
CREATE DATABASE IF NOT EXISTS 数据库名
子句来避免抛出数据库已存在的警告信息; - 可以使用正则表达式来筛选需要的数据库名,如
SHOW DATABASE LIKE 'h.*'
; - 除了
deault
数据库没有自己的目录外,Hive会为每个数据库创建一个目录(该目录位于属性hive.metastore.warehouse.dir
所指定的顶层目录之后,且数据库的文件目录名以.db
结尾),该库中的表将会以这个数据库目录的子目录形式存储; hdfs:///user/hive/warehouse/...
与hdfs://master-server/user/hive/warehouse/...
等价,其中master-server
是主节点的DNS名和可选的端口号;- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X0ETe2rF-1650691850666)(C:/Users/surface/Desktop/lADPJwY7R8FewajNDZDNEhA_4624_3472.jpg_720x720q90g.jpg)]
- 默认情况下,Hive是不允许用户删除一个包含有表的数据库。删库的方法有:
- 先删除数据库中的表,然后再删除数据库;
- 再删除命令的最后面加上关键字
CASCADE
,这样可以使Hive自行先删除数据库中的表
4.2 Hive中的表
第5章 HiveQL:数据操作
第6章 HiveQL:查询
第7章 HiveQL:视图
第8章 HiveQL:索引
第9章 模式设计
第10章:调优
第11章:其他文件格式和压缩方法
第12章:开发
第13章:函数
第14章:Streaming
第15章:自定义Hive文件和记录格式
第16章:Hive的Thrift服务
第17章:存储处理程序和NoSQL
第18章:安全
第19章:锁
第20章:Hive和Oozie整合
第21章:Hive和亚马逊网络服务系统(AWS)
第22章:HCatalog
第23章:案例研究
ve文件和记录格式