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;

显示hive中表 hive refresh table tablename_数据

1.1.2创建库带注释

create database if not exists db2 comment 'learning hive';

显示hive中表 hive refresh table tablename_大数据_02

1.1.3创建库带属性

create database if not exists db3 with dbproperties('creator'='hadoop','date'='2022-10-21');

 

显示hive中表 hive refresh table tablename_数据_03

1.2查看数据库

1.2.1常用方式

show databases;

显示hive中表 hive refresh table tablename_显示hive中表_04

1.2.1查看数据库的详细信息

desc database db3;

显示hive中表 hive refresh table tablename_hive_05

desc database extended db3;

显示hive中表 hive refresh table tablename_hive_06

1.2.3查看正在使用哪个库

select current_database();

显示hive中表 hive refresh table tablename_hive_07

1.3删除数据库

默认情况下,hive 不允许删除包含表的数据库。需要使用cascade 关键字。

drop database if exists db3 cascade;

显示hive中表 hive refresh table tablename_hive_08

1.4切换数据库

use db2;

显示hive中表 hive refresh table tablename_hive_09

2,Hive对表的操作

2.1内部表和外部表

2.1.1内部表

显示hive中表 hive refresh table tablename_数据库_10

 表目录hive会自动创建在默认的HDFS目录下/user/hive/warehouse/…

显示hive中表 hive refresh table tablename_数据_11

*删除一个内部表时,表的元信息和表数据目录都会被删除。

2.2.2外部表

创建的时候,需要使用external关键字,并指定表对应hdfs上的目录

显示hive中表 hive refresh table tablename_显示hive中表_12

显示hive中表 hive refresh table tablename_数据_13

*删除一个外部表时,只删除表的元信息,表的数据目录不会被删除。

外部表的意义

通常,一个数据仓库系统,数据总有一个源头,而源由一般是别的应用程序产生的,其目录无法确定,为了方便映射,就可以在hive中用外部表映射。并且,就算hive中把这个表删了,也不会删除数据目录,就不会影响到别的应用系统。

2.2数据的导入导出

2.2.1导入

(1)

load data local inpath '/opt/testData/hive/student.txt' into table student1;

显示hive中表 hive refresh table tablename_显示hive中表_14

显示hive中表 hive refresh table tablename_大数据_15

加overwrite可以实现覆盖,不加overwrite是追加到表后面。

load data local inpath ‘/opt/testData/hive/student.txt’overwrite into table student2;

显示hive中表 hive refresh table tablename_hive_16

显示hive中表 hive refresh table tablename_数据_17

(2)

将hdfs上的文件导入表中。

上传文件到HDFS

显示hive中表 hive refresh table tablename_hive_18

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;

显示hive中表 hive refresh table tablename_大数据_19

如果表已经存在,将into替换为overwrite,会覆盖掉原来表中的数据

2.2.2导出

将数据从hive的表中导出到hdfs的目录中

insert overwrite directory '/student'
select * from student1;

显示hive中表 hive refresh table tablename_hive_20

将数据从hive的表中导出到本地磁盘的目录中

insert overwrite local directory '/opt/testData/hive/student.log'
select * from student1;

2.3查看表

2.3.1查看表信息

desc student;

显示hive中表 hive refresh table tablename_数据库_21

2.3.2查看表的详细信息

desc extended student;

显示hive中表 hive refresh table tablename_hive_22

desc formatted student;

显示hive中表 hive refresh table tablename_hive_23

2.3.3查看表的详细建表语句

show create table student;

显示hive中表 hive refresh table tablename_大数据_24

2.4修改表

2.4.1修改表名

alter table student1 rename to student_table;

显示hive中表 hive refresh table tablename_hive_25

2.4.2修改字段

增加一个字段:

alter table student_table add columns (score int);

显示hive中表 hive refresh table tablename_大数据_26

修改一个字段的定义:

alter table student_table change name new_name string;

 

显示hive中表 hive refresh table tablename_数据库_27

2.5删除和清空表

2.5.1删除表

drop table student3;

显示hive中表 hive refresh table tablename_hive_28

2.5.2清空表

truncate table student_table;

显示hive中表 hive refresh table tablename_数据库_29

2.6分区表

2.6.1创建分区表

create table student1(id int,name string,age int)
partitioned by (birthday string)
row format delimited
fields terminated by ',';

显示hive中表 hive refresh table tablename_大数据_30

2.6.2导入数据(通过加载数据实现添加分区)

load data local inpath '/opt/testData/hive/student.txt' into table student1 partition(birthday='15');

显示hive中表 hive refresh table tablename_大数据_31

2.6.3增删分区

查看分区信息

show partitions student1;

显示hive中表 hive refresh table tablename_数据_32

 增加分区

alter table student1 add partition(birthday='20');

显示hive中表 hive refresh table tablename_数据_33

删除分区

alter table student1 drop partition(birthday='20');

显示hive中表 hive refresh table tablename_显示hive中表_34

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);

显示hive中表 hive refresh table tablename_数据库_35

2.8表的关联操作

2.8.1join操作

准备数据

显示hive中表 hive refresh table tablename_hive_36

显示hive中表 hive refresh table tablename_数据库_37

分别创建两个表并导入数据

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;

 

显示hive中表 hive refresh table tablename_显示hive中表_38

(1)内连接

select * from t1 inner join t2 on wupinid = jiageid;

 

显示hive中表 hive refresh table tablename_数据_39

(2)左外连接

select * from t1 left join t2 on wupinid = jiageid;

显示hive中表 hive refresh table tablename_显示hive中表_40

(3)右外连接

select * from t1 right join t2 on wupinid = jiageid;

显示hive中表 hive refresh table tablename_数据_41

(4) 全外连接

select * from t1 full join t2 on wupinid = jiageid;

显示hive中表 hive refresh table tablename_数据_42

2.8.2union和union all

union关联的时候会对数据进行去重,union all不会

 union

select * from student1 union all select * from student2;

显示hive中表 hive refresh table tablename_数据_43

union all

select * from student1 union select * from student2;