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'='2022-10-20');
1.最常用查看库方式。
show databases;
2.显示数据库的详细属性信息。
desc database t3;
desc database extended t3;
3.查看正在使用哪个库。
select current_database();
默认情况下,hive 不允许删除包含表的数据库。需要使用cascade 关键字。
drop database if exists t3 cascade;
切换到t2数据库。
use t2;
1.内部表
表目录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’;
drop在内部表时,表的元信息和表数据目录都会被删除,drop在外部表时,只删除表的元信息,表的数据目录不会被删除。
1.导入
将hive服务器运行所在节点的本地磁盘上的文件导入表中。
在/opt/testData/hive目录下创建一个文本文档
1,zhangsan,23,beijing
2,lisi,22,shanghai
3,wangwu,21,guangzhou
4,zhaoliu,20,xinjiang
注意:这里load的文件是在开启server的节点上。不是在客户端节点上。
我们编辑的数据如果有中文,必须得是UTF-8编码格式,否则数据会出现乱码现象
load data local inpath '/opt/test_1.txt' into table test_1;
select * from test_1;
加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;
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;
map:select piaofang["a1"] from movie_info;
struct:select address.location from movie_info;
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;
新建表。
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;
修改表名。
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;
1.分区就是表目录中的一个子目录。
建表
create table test_4(id int,name string,salary bigint,addr string)
partitioned by (day string)
row format delimited
fields terminated by ‘,’;
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;
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');
新建表。
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;
查询的分区字段要写在最后。
创建分桶表
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份(桶)。
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;
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中的join分为了内连接、左外连接、右外连接、全外连接。
内连接:inner join
select * from
t_order inner join t_goods
on order_id = good_id;
只会把相同关联条件匹配上的数据保留下来。
左外连接:
select * from t_goods left join t_order on goods_id = order_id;
右外连接:
select * from t_order right join t_goods on order_id = good_id;
全外连接:
select * from t_order full join t_goods on orderid = goodid;
union关联的时候会对数据进行去重
select * from now_test union select * from test_6;