目录
一、对数据库的操作
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 直接创建
create table t1;
show databases;
1.2 创建库的时候带注释
create database if not exists t3 comment 'learning hive';
查看
desc database t2;
1.3 创建带属性的库
create database if not exists t2 with dbproperties('creator'='hadoop','date'='2019-01-01');
查看
desc database extended t3;
2.1 最常用查看库方式。
show databases;
2.2 显示数据库的详细属性信息。
desc database t3;
desc database extended t3;
2.3 查看正在使用哪个库。
select current_database();
drop database t3;
默认情况下,hive 不允许删除包含表的数据库。需要使用cascade 关键字。
drop database if exists t3 cascade;
use t2;
表目录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
创建的时候,需要使用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.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;
上传文件到HDFS
hdfs dfs -put worker_1.txt /worker1
从别的表查询数据后插入到一张新建的表中,表会自动生成。
create table s1
as
select id,name
from s;
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;
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。
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;
将从别的表查询的数据放入到seq中
insert into worker_seq
select id,name from worker_1;
将查询出来的数据直接使用sequencefile保存。
create table worker_seq
stored as sequencefile
as
select *
from worker_1;
查询seq表的信息
select * from worker_seq;
将查询出来的数据直接使用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
将查询出来的数据直接使用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
新建表
create table student(id int,name string)
row format delimited
fields terminated by “,”;
查看表信息
desc student;
查看表的详细信息
desc extended student;
desc formatted student;
查看表的详细建表语句
show create table student;
修改表名
alter table student rename to new_student;
修改字段
增加一个字段:
alter table new_student add columns (score int);
修改一个字段的定义:
alter table new_student change name new_name string;
注:不支持删除字段
删除表
drop table new_student;
清空表
truncate table student;
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');
查看
select * from work_part where day=’01’;
9.3 增删分区
查看分区信息。
show partitions work_part;
增加分区:
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');
还可以使用insert实现分区:
insert into table work_part partition(day='06')
select * from worker_2 where salary>=5000;
删除分区:
alter table work_part drop partition(day='02');
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;
查询的分区字段要写在最后。
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 查看存储信息
查看存储信息
10.5 查看分桶数据
查看分桶数据
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份(桶)。
11.1 创建
create view v_name(字段)
as
select * from t_student;
注:视图不能load数据,也不能insert。只能用来进行查询。
视图是一个逻辑的概念,并不是物理上存在的。
11.3 删除
drop view v_name;
数据准备
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;
12.2 左外连接
select *
from order_json left join goods_json
on order_id = goods_id;
12.3 右外连接
select *
from order_json right join goods_json
on order_id = goods_id;
12.4 全外连接
select *
from order_json full join goods_json
on order_id = goods_id;
笛卡尔积:假设集合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;
union关联的时候会对数据进行去重,union all不会。
union:
select * from worker_1
union
select * from worker_2;
union all:
select * from worker_1
union all
select * from worker_2;