1. 数据库管理
1.创建一个名为myhive的数据库,并添加描述信息和属性信息
create database myhive comment 'this is myhive db' with dbproperties('author'='ljy','date'='2018-0510');
2.查看属性信息
describe database extended myhive;
3.在数据库原有属性的基础增加新的属性
alter database myhive set dbproperties('id'='1');
4.切换数据库myhive
use myhive;
5.列出所有的数据库
show databases;
6.删除数据库myhive
drop database myhive;
2. 数据表管理
1.创建表
create table t_order(id int,name string,rongliang double) row format delimited fields terminated by '\t';
2.显示所有的表
show tables;
3.查看表结构
#方式1
desc t_order;
#方式2
desc extended t_order;
#方式3
desc formatted t_order;
4.重命名表
#将t_order的表名修改为t_user
alter table t_order rename to t_user;
5.修改列名
#将字段rongliang改成int 类型的age,并添加描述信息(comment的内容可选)
alter table t_user change column rongliang age int comment 'user name';
6.增加列
alter table t_user add columns(address string comment 'user address',phone string comment 'user phone');
7.使用after 关键字,将修改后的字段放在某字段之后
#将phone字段修改为email,并将其放在age之后
alter table t_user change column phone email string after age;
8.使用first关键字,将修改的字段调到第一个字段
#修改age的类型为tinyint,并将其移到第一个字段
alter table t_user change column age age tinyint first;
9.删除列
#删除列时,将不要删除的列放在columns里面,有逗号隔开-->删除address
alter table t_user replace columns(id int,name string,age int,email string);
3. 从文件中向表中导入数据
1.准备数据
vim user1.txt
0011 张三 男 20 [email protected]
0012 李四 男 22 [email protected]
0013 王五 女 25 [email protected]
0014 赵六 男 21 [email protected]
vim user2.txt
0021 小明 男 20 [email protected]
0022 小李 女 22 [email protected]
0023 小红 女 25 [email protected]
0024 小刚 男 21 [email protected]
2.创建t_user1表
#创建t_user1表
create table t_user1(id int comment 'user id',
name string comment 'user name',
sex string comment 'user sex',
age int comment 'user age',
email string comment 'user email'
) row format delimited fields terminated by '\t';
#创建t_user2表
create table t_user2(id int comment 'user id',
name string comment 'user name',
sex string comment 'user sex',
age int comment 'user age',
email string comment 'user email'
) row format delimited fields terminated by '\t';
3.将1中创建的user2.txt上传到dhfs上hive文件夹下
hadoop fs -put user2.txt /hive
4.从linux上将user1.txt导入到表t_user1中
load data local inpath '/home/hadoop1/test/user1.txt' into table t_user1;
5.使用overwrite关键字,将user2.txt的数据导入到t_user1表,则t_user1表的数据会被覆盖成user2.txt
load data local inpath '/home/hadoop1/test/user2.txt' overwrite into table t_user1;
6.从hdfs上将user2.txt导入到表t_user1中
#如果不加overwrite关键字,则是在原有数据的基础上增加新的数据
#如果是从hdfs上加载数据到表中,则hdfs上的数据会被移动(不是复制哦,是直接移动)到t_usre1下面
load data inpath '/hive/user2.txt' into table t_user1;
4. 将数据从一个表中导入到另一个表中
1.加载linux上的user2.txt到表t_user2
load data local inpath '/home/hadoop1/test/user2.txt' into table t_user2;
2.从表t_usre2中到加载数据到t_user1中(需要t_user1和t_user2具有想同的表结构)
insert into table t_user1 select * from t_user2;
3.将表t_user2的数据加载到t_user1中,并覆盖user1中原来的数据(需要t_user1和t_user2具有想同的表结构)
insert overwrite table t_user1 select * from t_user2;
4.多插入模式
#需要t_user1和t_user2具有想同的表结构
from t_user2 insert into table t_user1 select *;
#从表t_user2中查询到的结果集需要与表t_user1具有相同的数据结构(字段个数,类型匹配)
from t_user2 insert into table t_user1 select id,name,sex,age,email;
5.多插入覆盖模式
#结合4#1中的情况,该情况会覆盖表t_user1的原有数据
from t_user2 insert overwrite table t_user1 select *;
#结合4#2中的情况,该情况会覆盖表t_user1的原有数据
from t_user2 insert overwrite table t_user1 select id,name,sex,age,email;
5. 导出表数据
1.导出到linux本地
insert overwrite local directory '/home/hadoop1/test/fromhive' row format delimited fields terminated by '\t' select * from t_user1;
2.导出到hdfs的文件夹内
insert overwrite directory 'hdfs://192.168.93.111:9000/hive' row format delimited fields terminated by '\t' select * from t_user1;
6. 内部表和外部表
内部表:在hive创建的时候,默认情况下hive负责管理数据,即hive把数据移入它的仓库目录”warehouse”
外部表:有用户来控制数据的创建和删除,外部数据的位置需要在创建表的时候指明,使用external关键字以后,hive知道数据并不由自己管理,因此不会把数据移动到自己的数据仓库目录.事实上在定义的时候,它甚至不是检查这以路径存在.这是一个非常重要的特性,因为这意味着你可以把创建数据推迟到创建表之后再进行.
主要区别:
内部表在删除表的时候,元数据和数据文件会一起被删除.而外部表只会删除表的元数据,不会删除数据文件本身.
1.根据hdfs上的文件目录创建外部表,删除hdfs上的数据文件,表中的数据也有没有了
数据格式需要与表格式一样,否则无法从表中得到正确的数据,可同时识别多个文件到表中
create external table t_user3(id int comment 'user id',
name string comment 'user name',
sex string comment 'user sex',
age int comment 'user age',
email string comment 'user email'
) row format delimited fields terminated by '\t'
stored as textfile
location 'hdfs://192.168.93.111:9000/hive';
-----------------------------------------------------------------------------------
#将user2.txt传到/hive文件夹下,即可从表中回去数据
hadoop fs -put /home/hadoop1/test/user1.txt /hive
hive> select * from t_user3;
OK
11 张三 男 20 zhangsan@163.com
12 李四 男 22 lisi@qq.com
13 王五 女 25 wangwu@126.com
14 赵六 男 21 zhaoliu@qq.com
2.根据linux的文件目录创建外部表(数据文件需要事先存在,创建表的时候才可以直接有数据,如果表创建了才创建的数据文件,需要load data后才能有数据,这是linux本地与hdfs上创建外部表的区别)
同时删除了linux上的数据文件,还能从表中获取到数据
create external table t_user4(id int comment 'user id',
name string comment 'user name',
sex string comment 'user sex',
age int comment 'user age',
email string comment 'user email'
) row format delimited fields terminated by '\t'
stored as textfile
location '/home/hadoop1/test/hivedb';
7. 表的查询操作
准备测试数据
student.txt
字段:sno sname sex age sdept
95001 张三 男 20 计算机科学 95002 李四 男 21 信息与计算科学 95003 王五 女 19 应用数学 95004 赵六 男 22 软件工程
创建student表
create table student(sno int,sname string,sex string,age int,sdept string) row format delimited fields terminated by '\t' stored as textfile;
load数据到表student
load data local inpath '/home/hadoop1/test/student.txt' into table student;
course.txt
字段 cno cname
1 数据库 2 数学 3 网络工程 4 信息系统 5 操作系统 6 数据结构
创建course表
create table course(cno int,cname string) row format delimited fields terminated by '\t' stored as textfile;
load 数据到course表
load data local inpath '/home/hadoop1/test/course.txt' into table course;
sc.txt
字段sno cno grade
95001 1 81 95001 2 85 95001 3 88 95002 4 98 95002 1 97 95002 2 90 95004 4 80
创建sc表
create table sc(sno int,cno int,grade int) row format delimited fields terminated by '\t' stored as textfile;
load数据到sc表
load data local inpath '/home/hadoop1/test/sc.txt' into table sc;
查询操作
查询选修了课程的学生姓名
#内链接 inner关键字可以省略 select distinct student.sno,sname from student inner join sc on student.sno=sc.sno; #或者 select sno,sname from student where sno in (select distinct sno from sc);
查询学生的总人数
select count(sno) from student;
计算1号课程的平均分
select avg(grade) from sc where cno=1;
查询各科成绩平均分
#hql的执行顺序是 先分组,然后再求每组的平均分 select cno,avg(grade) from sc group by cno;
查询选修1号课程的学生最高分数
select max(grade) from sc where cno=1;
左外连接
找出左右表中student.sno=sc.sno的共同部分,然后再加上左表中剩下的,对应右边中用null来补齐
select * from student left join sc on student.sno=sc.sno; <hr /> 95001 张三 男 20 计算机科学 95001 1 81 95001 张三 男 20 计算机科学 95001 2 85 95001 张三 男 20 计算机科学 95001 3 88 95002 李四 男 21 信息与计算科学 95002 4 98 95002 李四 男 21 信息与计算科学 95002 1 97 95002 李四 男 21 信息与计算科学 95002 2 90 95003 王五 女 19 应用数学 NULL NULL NULL 95004 赵六 男 22 软件工程 95004 4 80
右外连接
找出左右表中共同的部分,然后再加上右表中的剩下的,对应左表中用null来补齐
select * from student right join sc on student.sno=sc.sno;
全链接(mysql不支持)
找出左右表中共同的部分,然后加上左表中剩余的部分,对应右表中用null来补齐,之后再加上右表中剩余的部分,对应左表中用null来补齐
select * from student full join sc on student.sno=sc.sno;
左外连接,右外连接,全链接更好的例子说明:
表a
id name 001 张三 002 李四 003 赵六
表b
id sex 001 男 002 女 005 男
左连接
select * from a left join b on a.id=b.id; ----------------------------------------- 001 张三 001 男 002 李四 002 女 003 赵六 null null
右外连接
select * from a right join b on a.id=b.id; ----------------------------------------- 001 张三 001 男 002 李四 002 女 null null 005 男
全外链接
select * from a full join b on a.id=b.id; 001 张三 001 男 002 李四 002 女 003 赵六 null null null null 005 男
以上全是经过测试过的HQL语句,不全面,后期会再更新…