Hive是基于Hadoop的一个【数据仓库工具】,可以将结构化和半结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能。
Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,简单来说Hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至可以说Hive就是MapReduce客户端。
优点
缺点
Hive允许clien连接的方式有三个Cli(Hive Shell)、JDBC/ODBC(Java访问hive)、WEBUI(浏览器访问Hive)。JDBC访问时中间件Thrift软件框架,跨语言服务开发。DDL、DQL、DML,整体仿写一套SQL语句。
元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型 (是否是外部表)、表的数据所在目录等。
元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中,推荐使用Mysql进行存储。
(1) 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般使用第三方工具库完成,比如ANTLR;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2) 编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3) 优化器(Query Optimizer):对逻辑执行计划进行优化。
(4) 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
Hive的数据存储在HDFS中,计算由MapReduce完成。HDFSh和MapReduces是源码级别上整合,两者结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。
服务端启动metastore服务 nohup hive --service metastore > /dev/null 2>&1 &
进入命令 hive
退出命令 quit;
Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器来完成访问操作,这是生产环境用法最多的。
服务端启动hiveserver2服务 nohup hiveserver2 > /dev/null 2>&1 &
进入命令 1) 先执行beeline,再执行 connect jdbc:hive2://node1:10000
2) 或者直接执行 beeline -u jdbc:hive2://node1:10000 -n root
退出命令行 exit
使用-e参数来直接执行hql的语句
bin/hive -e "use t_test;select * from test"
使用-f参数通过指定文本文件来执行hql的语句
hive -f hive.sql
1、创建一个数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db
create database shop;
2、避免要创建的数据库已经存在错误,增加if not exists判断
create database if not exists shop;
create database db_hive2 location '/db_hive2.db'
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置健-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
alter database db_hive set dbproperties('createtime' = '20210130')
1、显示数据库(show)
show databases;
2、可以通过like进行过滤
show databases like 'db_hive*';
3、查看详情(desc)
desc database db_hive
4、切换数据库
use db_hive
1、最简写法
drop database db_hive;
2、如果删除数据库不存在,最好判断一下
drop database if exists db_hive2;
3、如果数据库不为空,使用cascade命令强制删除。
drop database db_hive cascade;
data_type
primitive_type
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name,col_name, ...)
[SORTED BY(col_name [ASC|DESC],...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
1、数据案例
{
"name":"John",
"friends":["Anan","Cici"],
"children":{
"Dave":19,
"Kanavi":20
},
"address":{
"street":"love rode",
"city":"shaoxing"
}
}
2、文本数据
John,Anan_Cici,Dave:19_Kanavi:20,love rode_shaoxing
3、建表语句
create table if not exists t_person(
name string,
friends array,
children map,
address struct
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated ':'
lines terminated by '\n'
4、上传数据
# 将文本文件上传到HDFS
hdfs fs person.txt /data
# 将文本数据load进数据表
load data inpath '/data/person.txt' into t_person
show tables;
show tables like 'u';
alter table old_table_name rename to new_table_name;
1、查询表结构
desc test_new;
2、添加列
alter table test_new add columns (education string);
3、更新列
alter table test_new change education educationnew string;
drop table test_new;
# 创建表
create table if not exists person2(id int,name string) row format delimited fields terminated by '\t' stored as textfile location '/user/person2'
# 根据查询结果创建表
create table person3 as select * from person2;
# 根据已经存在的表结构创建表
create table person4 like person3;
#查询表的类型
desc formatted person;
外部表说明
创建外部表
create external table if not exists person01(
id int,
name string
) row format delimited fields terminated by '\t'
location '/data/user'
user.txt放在user目录下
内部表和外部表相互转换
alter table person01 set talproperties('EXTERNAL' = 'TRUE')
基本语法
load data # 加载数据
[local] # 本地,不加Local就是从HDFS,如果是HDFS,将会删除原来的数据
inpath # 数据路径
'/opt/module/data/student.txt' # 具体路径
overwrite # 覆盖
into table # 加入到表
student # 表的名字
[partition(partcol1=val1,...)] # 分区
加载linuxb本地数据
load data local inpath 'data/test/ftp/dep.txt' into table dept;
从HDFS文件系统向表中加载数据(需要提前将数据上传到hdfsw文件系统中)
hadoop fs -put data/test/ftp/dep.txt /data/inner/RAW/01/emp
load data inpath '/data/inner/RAW/01/emp/emp.txt' into table emp
加载数据并覆盖已有数据
load data inpath '/data/inner/RAW/01/emp/emp.txt' overwrite into table emp;
非常不建议使用insert插入数据
将表中的数据备份
1、将查询结果存放到本地
//创建存放数据的目录
mkdir -p root/data
//导出查询结果的数据
insert overwrite local directory '/root/data/user01' select * from t_user;
2、按照指定的方式将数据输出到本地
insert overwrite local directory '/root/data/person'
row format delimited fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n'
select * from t_person;
3、将查询结果输出到HDFS
//创建存放数据的目录
hdfs fs -mkdir -p /data/copy
//导出查询结果数据
insert overwrite directory '/data/copy/user'
row format delimited fields terminated by ','
select * from user;
4、直接使用HDFS命令保存表对应的文件夹
//创建存放数据的目录
hdfs fs -mkdir -p /data/copy
//使用HDFS命令拷贝文件到其他目录
hdfs fs -cp /hive/warehouse/t_person/* /data/person
5、将表结构和数据同时备份
1、将数据导出到HDFS
hdfs fs -mkdir -p /data/copy
2、导出查询结果数据
export table t_user to '/data/copy/user'
3、删除表结构
drop table t_user
4、恢复表结构和数据
import from '/data/copy/user'