1,Hive对数据库的操作
1.1创建数据库
1.2查看数据库
1.3删除数据库
1.4切换数据库
2,Hive对表的操作
2.1内部表和外部表
2.2数据的导入导出
2.3查看表
2.4修改表
2.5删除和清空表
2.6分区表
2.7分桶表
2.8表的关联操作
1,Hive对数据库的操作
1.1创建数据库
1.1.1创建库
create database db1;
1.1.2创建库带注释
create database if not exists db2 comment 'learning hive';
1.1.3创建库带属性
create database if not exists db3 with dbproperties('creator'='hadoop','date'='2022-10-21');
1.2查看数据库
1.2.1常用方式
show databases;
1.2.1查看数据库的详细信息
desc database db3;
desc database extended db3;
1.2.3查看正在使用哪个库
select current_database();
1.3删除数据库
默认情况下,hive 不允许删除包含表的数据库。需要使用cascade 关键字。
drop database if exists db3 cascade;
1.4切换数据库
use db2;
2,Hive对表的操作
2.1内部表和外部表
2.1.1内部表
表目录hive会自动创建在默认的HDFS目录下/user/hive/warehouse/…
*删除一个内部表时,表的元信息和表数据目录都会被删除。
2.2.2外部表
创建的时候,需要使用external关键字,并指定表对应hdfs上的目录
*删除一个外部表时,只删除表的元信息,表的数据目录不会被删除。
外部表的意义
通常,一个数据仓库系统,数据总有一个源头,而源由一般是别的应用程序产生的,其目录无法确定,为了方便映射,就可以在hive中用外部表映射。并且,就算hive中把这个表删了,也不会删除数据目录,就不会影响到别的应用系统。
2.2数据的导入导出
2.2.1导入
(1)
load data local inpath '/opt/testData/hive/student.txt' into table student1;
加overwrite可以实现覆盖,不加overwrite是追加到表后面。
load data local inpath ‘/opt/testData/hive/student.txt’overwrite into table student2;
(2)
将hdfs上的文件导入表中。
上传文件到HDFS
load data inpath '/student' into table student1;
加local是复制,不加是移动。
load data local inpath '/student' into table student1;
(3)
从别的表查询数据后插入到一张新建的表中,表会自动生成
load data local inpath '/student' into table student1;
如果表已经存在,将into替换为overwrite,会覆盖掉原来表中的数据
2.2.2导出
将数据从hive的表中导出到hdfs的目录中
insert overwrite directory '/student'
select * from student1;
将数据从hive的表中导出到本地磁盘的目录中
insert overwrite local directory '/opt/testData/hive/student.log'
select * from student1;
2.3查看表
2.3.1查看表信息
desc student;
2.3.2查看表的详细信息
desc extended student;
desc formatted student;
2.3.3查看表的详细建表语句
show create table student;
2.4修改表
2.4.1修改表名
alter table student1 rename to student_table;
2.4.2修改字段
增加一个字段:
alter table student_table add columns (score int);
修改一个字段的定义:
alter table student_table change name new_name string;
2.5删除和清空表
2.5.1删除表
drop table student3;
2.5.2清空表
truncate table student_table;
2.6分区表
2.6.1创建分区表
create table student1(id int,name string,age int)
partitioned by (birthday string)
row format delimited
fields terminated by ',';
2.6.2导入数据(通过加载数据实现添加分区)
load data local inpath '/opt/testData/hive/student.txt' into table student1 partition(birthday='15');
2.6.3增删分区
查看分区信息
show partitions student1;
增加分区
alter table student1 add partition(birthday='20');
删除分区
alter table student1 drop partition(birthday='20');
2.6.4动态分区
动态分区需要设置
set hive.exec.dynamic.partition.mode=nonstrict;
创建分区表
create table student_ptn_age(id int,name string)
partitioned by (age int);
插入数据实现动态分区
insert overwrite table student_ptn_age partition(age)
select id,name,age from student2;
2.7分桶表
概念:
分桶是相对分区进行更细粒度的划分(数据取样更高效)。分桶将整个数据内容按照某列属性值的hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash 值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
操作:
创建分桶表
create table student_bck(id int, name string)
clustered by (id) into 3 buckets
row format delimited fields terminated by ',';
插入数据
insert overwrite table student_bck
select id,name from student2;
查看数据
select * from student_bck tablesample(bucket 1 out of 3 on id);
2.8表的关联操作
2.8.1join操作
准备数据
分别创建两个表并导入数据
create table t1(wupinid int,name string)
row format delimited
fields terminated by ',';
load data local inpath '/opt/testData/hive/wupin.txt' into table t1;
create table t2(jiageid int,price int)
row format delimited
fields terminated by ',';
load data local inpath '/opt/testData/hive/jiage.txt' into table t2;
(1)内连接
select * from t1 inner join t2 on wupinid = jiageid;
(2)左外连接
select * from t1 left join t2 on wupinid = jiageid;
(3)右外连接
select * from t1 right join t2 on wupinid = jiageid;
(4) 全外连接
select * from t1 full join t2 on wupinid = jiageid;
2.8.2union和union all
union关联的时候会对数据进行去重,union all不会
union
select * from student1 union all select * from student2;
union all
select * from student1 union select * from student2;