hive对数据库及对表的操作

目录

一、对数据库的操作

1、创建数据库

2、查看数据库

3、删除数据库

4、切换数据库

二、对表的操作

1、内部表

2、外部表

3、数据的导入导出

4、hive的复杂数据类型

5、hive的文件存储格式

6、查看表信息

7、修改表

8、删除和清空表

9、分区表

10、分桶表

11、视图

12、表关联操作(join)

13、笛卡尔积

14、union和unionall


一、对数据库的操作

1、创建数据库

1.1 直接创建

create table t1;

show databases;

 hive对数据库及对表的操作_第1张图片

 1.2 创建库的时候带注释

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

查看

desc database t2;

hive对数据库及对表的操作_第2张图片

 

1.3 创建带属性的库

create database if not exists t2 with dbproperties('creator'='hadoop','date'='2019-01-01');

查看

desc database extended t3;

hive对数据库及对表的操作_第3张图片

2、查看数据库

2.1 最常用查看库方式。

show databases;

hive对数据库及对表的操作_第4张图片

 

2.2 显示数据库的详细属性信息。

desc database t3;

hive对数据库及对表的操作_第5张图片

desc database extended t3;

hive对数据库及对表的操作_第6张图片

2.3 查看正在使用哪个库。

select current_database();

 hive对数据库及对表的操作_第7张图片

 

3、删除数据库

drop database t3;

hive对数据库及对表的操作_第8张图片

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

drop database if exists t3 cascade;

 

4、切换数据库

use t2;

二、对表的操作

1、内部表

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

create table work_1(id int,name string,salary bigint,addr string)
row format delimited
fields terminated by ‘,’;

 // 创建 worker_1 内部表 ,字段包括 int 型的 id ,string 型的 name ,bigint 型的 salary,string 型的 addr

create table work_1(id int,name string,salary bigint,addr string)

// 创建表格时支持列分隔符

row format delimited

// 使用的分隔符为逗号(,)

fields terminated by ‘,’;

查看

新建一个正在使用的节点窗口进行查看

hdfs dfs -ls /user/hive/warehouse

 

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 ‘/work2’;

查看

注:

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

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

3、数据的导入导出

3.1 导入

将hive服务器运行所在节点的本地磁盘上的文件导入表中。

注意:

这里load的文件是在开启server的节点上。不是在客户端节点上。

我们编辑的数据如果有中文,必须得是UTF-8编码格式,否则数据会出现乱码现象。

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

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

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

写入数据

创建表

create table s(id int,name string)
row format delimited
fields terminated by ',';

 加载数据

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

 查看数据

select * from s;

hive对数据库及对表的操作_第9张图片

 上传文件到HDFS

hdfs dfs -put worker_1.txt /worker1

hive对数据库及对表的操作_第10张图片

从别的表查询数据后插入到一张新建的表中,表会自动生成。

create table s1
as
select id,name
from s;

 hive对数据库及对表的操作_第11张图片

3.2 导出

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

insert overwrite directory ‘/worker_1’

select * from work_1;

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

insert overwrite local directory ‘/opt/testData/hive/worker.log’

select * from worker_1;

 

4、hive的复杂数据类型

array、map、struct。

准备数据:

1 huangbo guangzhou,xianggang,shenzhen a1:30,a2:20,a3:100 beijing,112233,13522334455,500
2 xuzheng xianggang b2:50,b3:40 tianjin,223344,13644556677,600
3 wangbaoqiang beijing,zhejiang c1:200 chongqinjg,334455,15622334455,20

 

创建表

create table movie_info(
id int, 
name string, 
work_location array, 
piaofang map, 
address struct)
row format delimited 
fields terminated by " "
collection items terminated by ","
map keys terminated by ":" ;

 

加载数据

load data local inpath "/opt/testData/hive/movie_info.txt" into table movie_info;

查询语句

array:

select work_location[0] from movie_info;

hive对数据库及对表的操作_第12张图片

map:

select piaofang["a1"] from movie_info;

hive对数据库及对表的操作_第13张图片

 

 struct:

select address.location from movie_info;

hive对数据库及对表的操作_第14张图片

 

5、hive的文件存储格式

Hive支持多种文件格式:sequence file、text file、parquet file、rc file、orc file。

        textfile为默认格式,存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。

        SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。 SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。

        RC file一种行列存储相结合的存储方式。

        ORCFile数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。每一块的默认大小为256MB。ORC是hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快 快速列存取。

        Parquet也是一种列式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。Snappy压缩方式。

创建seq表,对应的文件类型是sequencefile。

create table worker_seq(id int,name string)

stored as sequencefile;

hive对数据库及对表的操作_第15张图片

 

将从别的表查询的数据放入到seq中

insert into worker_seq

select id,name from worker_1;

将查询出来的数据直接使用sequencefile保存。

create table worker_seq

stored as sequencefile

as

select *

from worker_1;

hive对数据库及对表的操作_第16张图片

查询seq表的信息

select * from worker_seq;

hive对数据库及对表的操作_第17张图片

 

将查询出来的数据直接使用orc保存。

create table worker_orc

stored as orc

as

select *

from worker_1;

查看

hdfs dfs -ls /user/hive/warehouse/t2.db/worker_orc/000000_0

hive对数据库及对表的操作_第18张图片

将查询出来的数据直接使用parquet保存。

create table worker_par

stored as parquet

as

select *

from worker_1;

查看

hdfs dfs -ls /user/hive/warehouse/t2.db/worker_par/000000_0

 

6、查看表信息

新建表

create table student(id int,name string)

row format delimited

fields terminated by “,”;  

查看表信息

desc student;

hive对数据库及对表的操作_第19张图片

查看表的详细信息

desc extended student;

hive对数据库及对表的操作_第20张图片

 

desc formatted student;

hive对数据库及对表的操作_第21张图片

查看表的详细建表语句

show create table student;

hive对数据库及对表的操作_第22张图片

7、修改表

修改表名

alter table student rename to new_student;

hive对数据库及对表的操作_第23张图片

修改字段

增加一个字段:

alter table new_student add columns (score int);

hive对数据库及对表的操作_第24张图片

修改一个字段的定义:

alter table new_student change name new_name string;

hive对数据库及对表的操作_第25张图片

 

注:不支持删除字段

8、删除和清空表

删除表

drop table new_student;

清空表

truncate table student;

9、分区表

9.1 创建

分区就是表目录中的一个子目录

create table work_part(id int,name string,salary bigint,addr string)

partitioned by (day string)

row format delimited

fields terminated by ‘,’;

注意:分区的字段一定不能在定义的字段里。

9.2 导入数据

load data local inpath '/opt/testData/hive/work_1.txt' into table worker_4 partition(day='01');
load data local inpath '/opt/testData/hive/work_1.txt' into table worker_4 partition(day='02');

查看

hive对数据库及对表的操作_第26张图片

select * from work_part where day=’01’;

 

9.3 增删分区

查看分区信息。

show partitions work_part;

hive对数据库及对表的操作_第27张图片

增加分区:

alter table work_part add partition(day='03') partition(day='04');

通过加载数据实现添加分区:

load data local inpath '/opt/testData/hive/work_1.txt' into table work_part partition(day='05');

 hive对数据库及对表的操作_第28张图片

 

还可以使用insert实现分区:

insert into table work_part partition(day='06')

select * from worker_2 where salary>=5000;

删除分区:

alter table work_part drop partition(day='02');

hive对数据库及对表的操作_第29张图片

9.4 动态分区

新建表

create table student_part_dy (id int,name string,sex string,age int,department string)

row format delimited fields terminated by ",";

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

把这一张表的内容直接插入到另一张表student_ptn_age中,并实现age为动态分区(不指定到底是哪种年龄,让系统自己分配决定)。

 

插入数据,实现动态分区。

动态分区需要设置set hive.exec.dynamic.partition.mode=nonstrict;不然会报错。

set hive.exec.dynamic.partition.mode=nonstrict;

创建分区表

create table stu_part_dy(id int,name string,sex string,department string)

partitioned by (age int);


查看

insert overwrite table stu_part_dy partition(age)

select id,name,sex,department,age from student; 

查询的分区字段要写在最后。

hive对数据库及对表的操作_第30张图片

10、分桶表

10.1 概念

        分桶是相对分区进行更细粒度的划分(数据取样更高效)。分桶将整个数据内容按照某列属性值的hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash 值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。

10.2 创建

创建分桶表

create table student_bck(id int, name string)

clustered by (id) into 3 buckets 

row format delimited fields terminated by ",";

10.3 导入数据

向桶中插入数据

insert overwrite table student_bck

select id,name from student;

10.4 查看存储信息

查看存储信息

hive对数据库及对表的操作_第31张图片

 

10.5 查看分桶数据

查看分桶数据

select * from student_bck tablesample(bucket 1 out of 3 on id);

hive对数据库及对表的操作_第32张图片

 

tablesample (bucket x out of y on id);

x表示从哪个桶(x-1)开始,y代表分几个桶,也可以理解分x为分子,y为分母,及将表分为y份(桶),取第x份(桶)。

11、视图

11.1 创建

create view v_name(字段)

as

select * from t_student;

注:视图不能load数据,也不能insert。只能用来进行查询。

        视图是一个逻辑的概念,并不是物理上存在的。

11.3 删除

drop view v_name;

12、表关联操作(join)
 

数据准备

order.txt

112,皮鞋

114,耳机

116,可乐

121,鼠标

110,钢笔

[root@hadoop01 datadir]# cat goods.txt

114,130

116,5

goods.txt

114,130
116,5
112,500
110,50
119,800

创建 order_json 

create table order_json(
orderid int,
name string
)
row format delimited
fields terminated by ",";

导入数据

load data local inpath '/opt/testData/hive/order.txt' into table order_json ;

创建 goods_json 

create table goods_json(
goodid int,
price int
)
row format delimited
fields terminated by ",";

导入数据

load data local inpath '/opt/testData/hive/goods.txt' into table goods_json ;

12.1 内连接::只会把相同关联条件匹配上的数据保留下来。

select *
from order_json inner join goods_json
on order_id = goods_id;

hive对数据库及对表的操作_第33张图片

12.2 左外连接

select *
from order_json left join goods_json
on order_id = goods_id;

hive对数据库及对表的操作_第34张图片

12.3 右外连接

select *
from order_json right join goods_json
on order_id = goods_id;

hive对数据库及对表的操作_第35张图片

12.4 全外连接

select *
from order_json full join goods_json
on order_id = goods_id;

hive对数据库及对表的操作_第36张图片

 

 

13、笛卡尔积

笛卡尔积:假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

两张表没有关联条件,但是需要关联的时候,就可以使用笛卡尔积。

创建

create table doctor_info(name string,second_dep string,illness string)

row format delimited fields terminated by ",";

加载数据

load data local inpath '/usr/datadir/doctor.txt' into table doctor_info;

创建

create table department_info(first_dep string,keyword string)

row format delimited fields terminated by ",";

加载数据

load data local inpath '/usr/datadir/department.txt' into table department_info;

开启权限

set hive.mapred.mode=nonstrict;

创建

create table hospital_info

as

select *

from doctor_info

join department_info

on 1=1;

查看

select *

from hospital_info

where second_dep regexp keyword;

14、union和unionall

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

union:

select * from worker_1

union

select * from worker_2;

hive对数据库及对表的操作_第37张图片

 

union all:

select * from worker_1

union all

select * from worker_2;

hive对数据库及对表的操作_第38张图片

你可能感兴趣的:(hive,数据库,hadoop)