1.对库的操作
(1)创建库
create database t1;
show databases;
(2)创建库的时候带注释。
create database if not exists t2 comment 'learning hive';
(3)创建带属性的库。
create database if not exists t3 with dbproperties('creator'='hadoop','date'='2019-01-01');
(4)查看库。
show databases;
(5)查看库的详细属性。
desc database 库名;
desc database extended 库名;
(6)查看正在使用的库。
select current_database();
(7)删除库。
drop database if exists 库名 cascade;
默认情况下,hive 不允许删除包含表的数据库。需要使用cascade 关键字。
(8)切换库。
use 库名;
2.对表的操作
(1)内部表
表目录hive会自动创建在默认的HDFS目录下/user/hive/warehouse/…。
create table worker_1(id int,name string,salary bigint,addr string)
row format delimited
fields terminated by ',';
(2)外部表
创建的时候,需要使用external关键字,并指定表对应hdfs上的目录/aa/bb。
create external table worker_2(id int,name string,salary bigint,addr string)
row format delimited
fields terminated by ','
location '/worker';
drop一个内部表时,表的元信息和表数据目录都会被删除。
drop一个外部表时,只删除表的元信息,表的数据目录不会被删除。
外部表的意义
通常,一个数据仓库系统,数据总有一个源头,而源由一般是别的应用程序产生的,其目录无法确定,为了方便映射,就可以在hive中用外部表映射。并且,就算hive中把这个表删了,也不会删除数据目录,就不会影响到别的应用系统。
(3)导入。
load data local inpath '/opt/testData/hive/worker_1.txt' into table worker_1;
(4)覆盖导入。
load data local inpath '/opt/testData/hive/worker_1.txt' overwrite into table worker_1;
(5)将hdfs上的文件导入表中。
上传文件到HDFS。
load data inpath '/worker_2' into table worker_2;
(6)查看表信息。
desc 表名;
(7)查看表的详细信息。
desc extended student;
desc formatted student;
(8)查看表的详细建表语句。
show create table student;
(9)修改表名。
alter table student rename to new_student;
(10)修改字段。
增加一个字段:alter table new_student add columns (score int);
修改一个字段的定义:alter table new_student change name new_name string;
不支持删除字段。
(11)删除表。
drop table new_student;
(12)清空表。
truncate table student;
(13)建表
create table worker_4(id int,name string,salary bigint,addr string)
partitioned by (day string)
row format delimited
fields terminated by ',';
注意:分区的字段一定不能在定义的字段里。
(14)导入数据到分区
load data local inpath '/usr/datadir/worker_1.txt' into table worker_4 partition(day='01');
load data local inpath '/usr/datadir/worker_1.txt' into table worker_4 partition(day='02');
它会将day这个分区条件也当成了一个字段。
如果只查询worker_4下day=01目录下的信息,可以用:
select * from worker_4 where day=’01’;
(15)增删分区
查看分区信息。
show partitions worker_4;
增加分区:
alter table worker_4 add partition(day='03') partition(day='04');
通过加载数据实现添加分区:
load data local inpath '/usr/datadir/worker_3.txt' into table worker_4 partition(day='05');
新建表。
create table student(id int,name string,sex string,age int,department string)
row format delimited fields terminated by ",";
load data local inpath '/usr/datadir/student.txt' into table student;
把这一张表的内容直接插入到另一张表student_ptn_age中,并实现age为动态分区(不指定到底是哪种年龄,让系统自己分配决定)。
(16)创建分区表。
create table student_ptn_age(id int,name string,sex string,department string)
partitioned by (age int);
插入数据,实现动态分区。
动态分区需要设置set hive.exec.dynamic.partition.mode=nonstrict;不然会报错。
insert overwrite table student_ptn_age partition(age)
select id,name,sex,department,age from student;
查询的分区字段要写在最后。