HIVE是什么?
HIVE是一个可以将sql翻译为MR程序的工具
HIVE支持用户将HDFS上的文件映射为表结构,然后用户就可以输入SQL对这些表(HDFS上的文件)进行查询分析
HIVE将用户定义的库、表结构等信息存储hive的元数据库中(可以是本地derby,也可以是远程mysql)
Hive是基于Hadoop的一个数据仓库工具(离线),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
为什么使用Hive
直接使用hadoop所面临的问题
人员学习成本太高
项目周期要求太短
MapReduce实现复杂查询逻辑开发难度太大
为什么要使用Hive
操作接口采用类SQL语法,提供快速开发的能力。
避免了去写MapReduce,减少开发人员的学习成本。
功能扩展很方便。
hive的特点
扩展 Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
延展性 Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
容错 良好的容错性,节点出现问题SQL仍可完成执行。
HIVE的用途?
解放大数据分析程序员,不用自己写大量的mr程序来分析数据,只需要写sql脚本即可
HIVE可用于构建大数据体系下的数据仓库
HIVE的使用方式?
方式1:可以交互式查询:
bin/hive -----> hive>select * from t_test;
将hive启动为一个服务: bin/hiveserver ,然后可以在任意一台机器上使用beeline客户端连接hive服务,进行交互式查询
服务端:bin/hiveserver2
客户端:bin/beeline
!connect jdbc:hive2://服务端主机名:监听的端口
输入密码
!quit 退出服务
方式2:可以将hive作为命令一次性运行:
bin/hive -e "sql1;sql2;sql3;sql4"
事先将sql语句写入一个文件比如 q.hql ,然后用hive命令执行: bin/hive -f q.hql
运行命令:hive -e "命令select * from 库名.表名;"
运行脚本:sh 脚本
如果文件过于复杂,可写在文档执行:hive -f 文件名
方式3:可以将方式2写入一个xxx.sh脚本中
查看数据库
show databases;
查看表
show tables;
创建表
create table 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
row format delimited
fileds terminated by '分隔符'
;
- 创建表结构相同的表
create table 表2 like 表1;
新建的表2表结构定义与源表表1一致,但是没有数据
create table 表2 as select 条件 from 表1;
表2根据select查询的字段来建表,同时将查询的结果插入新表中
- 创建内部表
create 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
row format delimited
fields terminated by '分隔符'
;
- 创建外部表
create external 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
row format delimited
fields terminated by '分隔符'
location '位置'
;
- 区别
内部表的目录由hive创建在默认的仓库目录下
外部表的目录由用户建表时自己指定
drop一个内部表时,表的元信息和表数据目录都会被删除;
drop一个外部表时,只删除表的元信息,表的数据目录不会删除;- 意义 通常,一个数据仓库系统,数据总有一个源头,而源头一般是别的应用系统产的, 其目录无定法,为了方便映射,就可以在hive中用外部表进行映射;并且,就算在hive中把
这个表给drop掉,也不会删除数据目录,也就不会影响到别的应用系统;
- 分区表
单个字段分区
create 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
partitioned by (字段名 字段类型)
row format delimited
fields terminated by '分隔符'
;
partitioned by 按...分区,且分区字段不能是表字段中已存在的
多个字段分区
create 表名(字段名 字段类型,字段名 字段类型,字段名 字段类型,...)
partitioned by (字段名 字段类型,字段名 字段类型...)
row format delimited
fields terminated by '分隔符'
;
导入数据
方式1:导入数据的一种方式:
手动用hdfs命令,将文件放入表目录;
方式2:在hive的交互式shell中用hive命令来导入本地数据到表目录
- 从本地导入数据到不同的分区目录:
load data local inpath ‘要导入的数据1’ into table表名 partition(字段名 字段类型1);
load data local inpath ‘要导入的数据2’ into table 表名 partition(字段名 字段类型2);- 将数据从hdfs导入表
load data inpath ‘要导入的数据路径’ into 表名 partition(字段名 字段类型2)
方式3:用hive命令导入hdfs中的数据文件到表目录
hive>load data inpath
‘/access.log.2017-08-06.log’ into table t_access partition(dt=‘20170806’);
注意:导本地文件和导HDFS文件的区别:
本地文件导入表:复制
hdfs文件导入表:移动导出数据
1、将hive表中的数据导入HDFS的文件
insert overwrite directory ‘/root/access-data’
row format delimited
fields terminated by ‘,’
select * from t_access;
2、将hive表中的数据导入本地磁盘文件
insert overwrite local directory ‘/root/access-data’
row format delimited
fields terminated by ‘,’
select * from t_access limit 100000;
查询
select * from 表名;
插入表
insert into 表2 select * from 表1;
将表1查询结果插入到表2
删除表
drop table 表名;