1、概念
(1)Hive 是建立在 Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL ,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
(2)Hive是SQL解析引擎,它将SQL语句转译成MR Job然后在Hadoop执行。
(3)Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在MR Job里使用这些数据。
(4)Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上。
(5)Hive中存储结构和HDFS里面的存储结构的对应关系
Hive的表 HDFS的目录
Hive的数据 HDFS的目录下面的(数据)文件
Hive中行 HDFS的目录下面的数据文件的行列
(6)Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上。
2、数据存储
(1)Hive的数据存储基于Hadoop HDFS
(2)Hive没有专门的数据存储格式
(3)存储结构主要包括:数据库、文件、表、视图、索引
(4)Hive默认可以直接加载文本文件(TextFile),还支持SequenceFile、RCFile
(5)创建表时,指定Hive数据的列分隔符与行分隔符,Hive即可解析数据
3、Hive的体系结构
(1)用户接口主要有三个:CLI,JDBC/ODBC和 WebUI
(2)CLI,即Shell命令行
(3)JDBC/ODBC 是 Hive 的Java,与使用传统数据库JDBC的方式类似
(4)WebGUI是通过浏览器访问 Hive
(5)Hive 将元数据存储在数据库中(metastore),目前只支持 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等
(6)解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行
(7)Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from table 不会生成 MapRedcue 任务)
4、Hive的元数据
(1)metastore是hive元数据的集中存放地。
(2)metastore默认使用内嵌的derby数据库作为存储引擎
(3)Derby引擎的缺点:一次只能打开一个会话
(4)使用MySQL作为外置存储引擎,多用户同时访问
5、创建表
#创建数据(文本以tab分隔)
~ vi /usr/local/hive/my_hive/t_hive.txt
16 2 3
61 12 13
41 2 31
17 21 3
71 2 31
1 12 34
11 2 34
#创建新表
hive> CREATE TABLE t_hive (a int, b int, c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.489 seconds
#导入数据t_hive.txt到t_hive表
hive> LOAD DATA LOCAL INPATH '/usr/local/hive/my_hive/t_hive.txt' OVERWRITE INTO TABLE t_hive ;
Copying data from file:/home/cos/demo/t_hive.txt
Copying file: file:/home/cos/demo/t_hive.txt
Loading data to table default.t_hive
Deleted hdfs://c1.wtmart.com:9000/user/hive/warehouse/t_hive
OK
Time taken: 0.397 seconds
6、Hive交互式模式
- quit,exit ;退出交互式shell
- reset: 重置配置为默认值
- set = : 修改特定变量的值(如果变量名拼写错误,不会报错)
- set : 输出用户覆盖的hive配置变量
- set -v : 输出所有Hadoop和Hive的配置变量
- add FILE[S] , add JAR[S] , add ARCHIVE[S] * : 添加 一个或多个 file, jar, archives到分布式缓存
## 从HDFS加载数据 ##
创建表t_hive2
hive> CREATE TABLE t_hive2 (a int, b int, c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
#从HDFS加载数据
hive> LOAD DATA INPATH '/user/hive/warehouse/t_hive/t_hive.txt' OVERWRITE INTO TABLE t_hive2;
Loading data to table default.t_hive2
Deleted hdfs://moon:9000/user/hive/warehouse/t_hive2
OK
Time taken: 0.325 seconds
7、从其他表导入数据
hive> INSERT OVERWRITE TABLE t_hive2 SELECT * FROM t_hive ;
创建表并从其他表导入数据
#删除表
hive> DROP TABLE t_hive;
#创建表并从其他表导入数据
hive> CREATE TABLE t_hive AS SELECT * FROM t_hive2 ;
仅复制表结构不导数据
hive> CREATE TABLE t_hive3 LIKE t_hive;
hive> select * from t_hive3;
OK
Time taken: 0.077 seconds
8、通过Hive导出到本地文件系统
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/t_hive' SELECT * FROM t_hive;