Hive对数据库及对表的操作

1.Hive对库的操作

1.1创建库

 1.简单方式。

create database t1;

show databases;

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

2.创建库的时候带注释。

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

3.创建带属性的库。

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

1.2查看库

1.最常用查看库方式。

show databases;

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

desc database t3;

desc database extended t3;

3.查看正在使用哪个库。

select current_database();

1.3删除库与切换库

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

drop database if exists t3 cascade;

切换到t2数据库。

use t2;

2.Hive对表的操作

2.1内部表与外部表

1.内部表

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

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

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

row format delimited

fields terminated by ‘,’;

2.外部表

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

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

row format delimited

fields terminated by ‘,’

location ‘/test’;

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

drop在内部表时,表的元信息和表数据目录都会被删除,drop在外部表时,只删除表的元信息,表的数据目录不会被删除。

 2.2数据的导入导出

1.导入

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

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

在/opt/testData/hive目录下创建一个文本文档

1,zhangsan,23,beijing
2,lisi,22,shanghai
3,wangwu,21,guangzhou
4,zhaoliu,20,xinjiang

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

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

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

load data local inpath '/opt/test_1.txt' into table test_1;

select * from test_1;

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

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

load data local inpath ‘/opt/test_1.txt’ overwrite into table test_1;

将hdfs上的文件导入表中。

上传文件到HDFS。

load data inpath '/test_2' into table test_2;

会发现hdfs上的/test_1被移动到表目录下。

加local是复制,不加是移动。 

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

create table test_3
as
select id,name,age,addr
from test_1
where ega>=20;

 2.导出

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

insert overwrite directory ‘/test_1’

select * from test_1;

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

insert overwrite local directory ‘/test_1’

select * from test_1;

2.3Hive的复杂数据类型

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对数据库及对表的操作_第7张图片

 map:select piaofang["a1"] from movie_info;

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

struct:select address.location from movie_info;

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

 2.4Hive的文件存储格式

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

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

create table test_seq(id int,name string)

stored as sequencefile;

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

insert into test_seq

select id,name from test_1;

 将查询出来的数据保存。

 查询seq表的信息

select * from test_seq;

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

create table test_orc

as

select * from test_1;

 

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

create table test_par

stored as parquet

as

select * from test_1;

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

2.5查看表信息

新建表。

create table student(id int,name string,age int)

row format delimited

fields terminated by “,”;  

查看表信息。

desc student;

查看表的详细信息。

desc extended student;

desc formatted student;

查看表的详细建表语句。

show create table student;

2.6修改表及删除和清空表

修改表名。

alter table test_1 rename to new_test;

修改字段。

增加一个字段:

alter table new_test add columns (score int);

 修改一个字段的定义:

alter table new_test change addr new_addr string;

 不支持删除字段。

删除表。

drop table test_orc;

清空表。

truncate table test_3;

3.Hive的分区表

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

建表

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

partitioned by (day string)

row format delimited

fields terminated by ‘,’;

 2.导入数据到分区 

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

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

它会将day这个分区条件也当成了一个字段。

 如果查询test_4可以用:

select * from test_4;

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

 3.增删分区

查看分区信息。

show partitions test_4;

增加分区:

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

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

load data local inpath '/opt/testData/hive/worker.txt' into table test_4 partition(day='03');

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

4.动态分区

新建表。

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

row format delimited fields terminated by ",";
load data local inpath '/opt/testData/hive/student.txt' into table student;

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

创建分区表。

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

partitioned by (age int);

row format delimited

fields terminated by ',';

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

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

 

 

insert overwrite table student_ptn_age partition(age)

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

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

5.Hive的分桶表

创建分桶表

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

 查看分桶数据

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

tablesample (bucket x out of y on id);

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

6.视图

create view v_name(字段)

as

select * from t_student;

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

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

drop view v_name;
name,age,idcard,cardnum

create view v_name(字段)

as

select name,age from table;

7.Hive的表关联操作

 join操作

数据准备:

 cat order.txt
112,皮鞋

114,耳机

116,可乐

121,鼠标

110,钢笔
cat goods.txt
114,130

116,5

112,500

110,50

119,800

创建表,导入数据:

create table t_order(id int,name string)

row format delimited

fields terminated by ",";
load data local inpath '/opt/testData/hive/order.txt' into table t_order;
create table t_goods(id int,price int)

row format delimited

fields terminated by ",";
load data local inpath '/opt/testData/hive/goods.txt' into table t_goods;

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

Hive中的join分为了内连接、左外连接、右外连接、全外连接。

内连接:inner join

select * from 
t_order inner join t_goods 
on order_id = good_id;

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

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

左外连接:

select * from t_goods left join t_order on goods_id = order_id;

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

  右外连接:

select * from t_order right join t_goods on order_id = good_id;

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

全外连接:

select * from t_order full join t_goods on orderid = goodid;

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

8.union和union all

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

select * from now_test union select * from test_6;

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

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