一、概念
Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL ,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。
Hive的数据存储基于Hadoop HDFS。Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上
三、Hive架构
1.元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等; 默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
2.使用HDFS进行存储,使用MapReduce进行计算。
3.驱动器 (1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
四、Hive与传统数据库作比较
查询语言 | HiveQL | SQL |
数据存储位置 | HDFS | Raw Device or 本地FS |
数据格式 | 用户定义 | 系统决定 |
数据更新 | 不支持(1.x以后版本支持) | 支持 |
索引 | 新版本有,但弱 | 有 |
执行 | MapReduce | Executor |
执行延迟 | 高 | 低 |
可扩展性 | 高 | 低 |
数据规模 | 大 | 小 |
五、hive启动方式
1、直接shell命令:hive
2、开启HIVE JDBC 连接:
(1)开启命令:进入hive的bin目录下
hive --service hiveserver2 //注意该进程不能被停止
netstat -nplt | grep 10000 当输入此命令出现进程就可以进行连接命令
(2)连接命令:进入hive的bin目录下
beeline -u jdbc:hive2://master:10000 -n root
六、hive基础命令
数据库
1、创建数据库
create database [IF NOT EXISTS] 库名 COMMENT "添加注释(例如加个中文名)";
可指定database在hdfs中的存储位置 :在后面加上location “路径”
创建数据库时增加配置信息
CREATE DATABASE IF NOT EXISTS test_database2 COMMENT "测试数据库创建" WITH DBPROPERTIES("author"="xingtong","application"="save base data");
2、删除数据库
drop database 库名; 只能删除空的数据库
DROP DATABASE 库名 cascade; 强制删除数据库
2、查看数据库信息
desc database 库名;
desc database extended 库名;
查看数据库创建的详细信息,包括配置的参数
表
1、查看表信息
DESC table_name (首先要use进入表所在的数据库)
查看表的字段信息
DESC FORMATTED table_name
查看表的详细信息
2、删除表
DROP TABLE table_name;
删除表时,HDFS上的数据也会跟着删除掉
3、表各结构信息
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name -- EXTERNAL表示外部表的标志
[(col_name data_type [COMMENT col_comment], ...)] -- 列名 数据类型 注释信息
[COMMENT table_comment] -- 表的注释信息
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] -- PARTITIONED BY 构建分区表 包括 列名 数据类型 注释信息
[CLUSTERED BY (col_name, col_name, ...) --CLUSTERED BY 分桶 列名
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] -- SORTED BY 分桶中的排序 INTO num_buckets BUCKETS 具体分成多少桶
[
[ROW FORMAT row_format] -- 表示数据的分隔信息
[STORED AS file_format] -- 表示存储格式
| STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ] (Note: only available starting with 0.6.0) --自定义存储类
][LOCATION hdfs_path] -- 表的存储位置
[TBLPROPERTIES (property_name=property_value, ...)] (Note: only available starting with 0.6.0) -- 表示表的配置信息
[AS select_statement] (Note: this feature is only available starting with 0.5.0.) -- AS 通过查询表创建(接查询语句)
(1)ROW FORMAT用法(对加入表的文件进行切片)
CREATE TABLE IF NOT EXISTS filetest.total_score( // (库名.表名)表示在某个库名中创建某个表
student_id STRING COMMENT "学生编号", //每一行前不需要加空格
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE; //自定义存储格式//将文件加入到表中
load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score;
注意:如果数据和分隔符不匹配则原始数据中的所有数据会变成新表中的一列数据
(2)LOCATION用法(自定义存储位置)
CREATE TABLE IF NOT EXISTS filetest.total_score3(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
LOCATION "/testDatabase/total_score"; //在hdfs中的存储地址
(3)EXTERNAL 用法(定义为外部表)
CREATE external TABLE IF NOT EXISTS filetest.total_score3(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
LOCATION "/testDatabase/total_score";
注: 外部表与普通内部表的区别在于:外部表删除表时不会删除对应的数据 并且和表数据存储位置无关
(4)STORED AS(设置数据存储格式)
使用方法一:
CREATE EXTERNAL TABLE IF NOT EXISTS filetest.total_score5(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS ORC; //自定义为压缩类
注意:如果数据存储格式为压缩格式,那么就不能直接将文本数据加载至表中
可以将别的表中数据加入其中:INSERT INTO TABLE filetest.total_score5 SELECT * FROM filetest.total_score
使用方法二:实用查询语言创建一个表,并通过另一个表的数据加入其中,但每个属性就没有注释信息了
CREATE TABLE IF NOT EXISTS filetest.total_score7 STORED AS ORC
AS SELECT student_id,score FROM filetest.total_score;
(5)TBLPROPERTIES 用法:添加表的配置信息,需要用 DESC FORMATTED table_name才能查看表达详细信息
CREATE EXTERNAL TABLE IF NOT EXISTS filetest.total_score8(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
TBLPROPERTIES("author"="xing","application"="学生表,保存学生的总分,如有错误请联系 XXX");
(6)AS 通过查询表创建
CREATE TABLE IF NOT EXISTS filetest.total_score7 STORED AS ORC
AS SELECT student_id,score FROM filetest.total_score;