hive 的HQL基本操作

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;

查询操作

  1. 查询选修了课程的学生姓名

    
    #内链接    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);
  2. 查询学生的总人数

    select count(sno) from student;
  3. 计算1号课程的平均分

    select avg(grade) from sc where cno=1;
  4. 查询各科成绩平均分

    
    #hql的执行顺序是 先分组,然后再求每组的平均分
    
    select cno,avg(grade) from sc group by cno;
  5. 查询选修1号课程的学生最高分数

    select max(grade) from sc where cno=1;
  6. 左外连接

    找出左右表中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
    

  7. 右外连接

    找出左右表中共同的部分,然后再加上右表中的剩下的,对应左表中用null来补齐

    select * from student right join sc on student.sno=sc.sno;

  8. 全链接(mysql不支持)

    找出左右表中共同的部分,然后加上左表中剩余的部分,对应右表中用null来补齐,之后再加上右表中剩余的部分,对应左表中用null来补齐

    select * from student full join sc on student.sno=sc.sno;

  9. 左外连接,右外连接,全链接更好的例子说明:

    表a

    id    name
    001   张三
    002 李四
    003   赵六

    表b

    id    sex
    001002005

    左连接

    
    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   张三  001002 李四    002003   赵六  null    null
    null  null    005

以上全是经过测试过的HQL语句,不全面,后期会再更新…

猜你喜欢

转载自blog.csdn.net/LLJJYY001/article/details/80285314
今日推荐