HiveQL操作详解

BUG之神 43

Hive的操作和mysql的操作几乎一样,这里针对不一样的地方进行讲解:

创建数据库:xuexi

[root@slave3 app]# hive

 

Logging initialized using configuration in jar:file:/root/app/apache-hive-1.2.2-bin/lib/hive-common-1.2.2.jar!/hive-log4j.properties

hive> create database xuexi;

OK

Time taken: 1.537 seconds

hive> show databases;

OK

default

xuexi

Time taken: 0.392 seconds, Fetched: 2 row(s)

hive>

 

数据库创建成功后会在hdfs的/user/hive/warehouse下生成一个以数据库命令的文件

[root@slave3 app]# hadoop fs -ls /user/hive/warehouse

Found 1 items

drwxr-xr-x   - root supergroup          0 2023-04-16 05:42 /user/hive/warehouse/xuexi.db

 

假设节点中存在这么一些学生的数据,现在需要创建一张表用于存放这些学生的数据:

 

唐洪玲,女,29

颜建强,男,29

舒楠松,男,18

罗小平,男,22

杨光大,男,25

朱雨龙,男,20

陈建,男,20

张元林,男,19

王崇如,男,27

周婷婷,女,29

秦增,男,23

廖英杰,男,24

刘龙,男,19

柏雅岚,女,27

 

同时注意:编写hive语句不建议直接在终端中编写,因为hive语句可能有多条,如果上一条语句写错了,是无法修改的

编写hive一般在notepad++中编写:

HiveQL操作详解

找不同:

1.HiveQL和MySQL略有不同,字符串mysql中用的是char或者varchar,hive用的是string

2.最后一行:row format delimited fields terminated by ',' 设置了分割的符号,因为数据格式如下,是用逗号分割的,所以创建表时,指定分割符为逗号。当把数据上传到hive的表中时,它将自动以逗号分割,将每个字段对应到创建的表字段上。

唐洪玲,女,29

颜建强,男,29

舒楠松,男,18

罗小平,男,22

杨光大,男,25

朱雨龙,男,20

陈建,男,20

张元林,男,19

王崇如,男,27

周婷婷,女,29

秦增,男,23

廖英杰,男,24

刘龙,男,19

柏雅岚,女,27

 

代码:

create table xuexi.student(

name string,

sex string,

age int

)

row format delimited fields terminated by ',';

针对最后一行说明如下:(如有疑问可以复制最后一行百度)

HiveQL操作详解

写完后复制粘贴到终端执行:

[root@slave3 app]# hive

 

Logging initialized using configuration in jar:file:/root/app/apache-hive-1.2.2-bin/lib/hive-common-1.2.2.jar!/hive-log4j.properties

hive> create table xuexi.student(

> name string,

> sex string,

> age int

> )

> row format delimited fields terminated by ',';

OK

Time taken: 2.075 seconds

hive> use xuexi;

OK

Time taken: 0.062 seconds

hive> show tables;

OK

student

Time taken: 0.281 seconds, Fetched: 1 row(s)

hive>

此时成功创建了student表

表创建成功后也会在hdfs下的xuexi.db下创建一个目录student用于存放数据:

[root@slave3 app]# hadoop fs -ls /user/hive/warehouse/xuexi.db

Found 1 items

drwxr-xr-x   - root supergroup          0 2023-04-16 06:09 /user/hive/warehouse/xuexi.db/student

 

由于hive是基于hdfs对数据进行分析,但是hdfs只提供数据的查询操作,不提供更新操作,所以hive也只有查询操作语句

 

要想添加学生数据到student表中可以采用映射的方式

只需要将学生数据上传到/user/hive/warehouse/xuexi.db/student 就可以实现映射

 

data文件内容:

HiveQL操作详解

先上传到/root/app

HiveQL操作详解

再执行映射:

[root@slave3 app]# hadoop fs -put data /user/hive/warehouse/xuexi.db/student

在hive中查看上传的数据:

[root@slave3 app]# hive

hive> use xuexi;

OK

Time taken: 0.134 seconds

hive> select * from student;

OK

唐洪玲 女 29

颜建强 男 29

舒楠松 男 18

罗小平 男 22

杨光大 男 25

朱雨龙 男 20

陈建 男 20

张元林 男 19

王崇如 男 27

周婷婷 女 29

秦增 男 23

廖英杰 男 24

刘龙 男 19

柏雅岚 女 27

Time taken: 1.139 seconds, Fetched: 14 row(s)

hive>

 

查询年龄小于等于20岁的同学的信息:

hive> select * from student where age <= 20;

OK

舒楠松 男 18

朱雨龙 男 20

陈建 男 20

张元林 男 19

刘龙 男 19

Time taken: 0.379 seconds, Fetched: 5 row(s)

hive>

 

除了使用put命令上传数据到集群,还可以使用hive命令上传数据

注意:hive命令必须在hive节点中使用,即slave3中

hive> load data local inpath "/root/app/data" into table xuexi.student;

Loading data to table xuexi.student

Table xuexi.student stats: [numFiles=2, totalSize=482]

OK

Time taken: 1.333 seconds

hive> select * from student;

OK

唐洪玲 女 29

颜建强 男 29

舒楠松 男 18

罗小平 男 22

杨光大 男 25

朱雨龙 男 20

陈建 男 20

张元林 男 19

王崇如 男 27

周婷婷 女 29

秦增 男 23

廖英杰 男 24

刘龙 男 19

柏雅岚 女 27

唐洪玲 女 29

颜建强 男 29

舒楠松 男 18

罗小平 男 22

杨光大 男 25

朱雨龙 男 20

陈建 男 20

张元林 男 19

王崇如 男 27

周婷婷 女 29

秦增 男 23

廖英杰 男 24

刘龙 男 19

柏雅岚 女 27

Time taken: 0.104 seconds, Fetched: 28 row(s)

hive>

 

其中into是追加,如果想覆盖表中的数据可以添加关键字overwrite

 

覆盖表中数据:

hive> load data local inpath "/root/app/data" overwrite into table xuexi.student;

Loading data to table xuexi.student

Table xuexi.student stats: [numFiles=1, numRows=0, totalSize=241, rawDataSize=0]

OK

Time taken: 0.746 seconds

hive> select * form student;

FAILED: ParseException line 1:9 missing EOF at 'form' near '*'

hive> select * from student;

OK

唐洪玲 女 29

颜建强 男 29

舒楠松 男 18

罗小平 男 22

杨光大 男 25

朱雨龙 男 20

陈建 男 20

张元林 男 19

王崇如 男 27

周婷婷 女 29

秦增 男 23

廖英杰 男 24

刘龙 男 19

柏雅岚 女 27

Time taken: 0.111 seconds, Fetched: 14 row(s)

 

需注意:

HiveQL操作详解

local代表从本地上传数据,数据上传后不会删除本地数据

如果去掉local则代表从集群中上传数据,集群上传数据采用的是移动的方式上传

通过集群上传:

1.先将数据上传到hdfs下的/inut下

[root@slave3 app]# hadoop fs -put data /input

[root@slave3 app]# hadoop fs -ls /input

Found 2 items

-rw-r--r--   3 root supergroup        241 2023-04-16 07:21 /input/data

-rw-r--r--   3 root supergroup         47 2023-02-25 21:38 /input/test.txt

2.将集群中的data文件移动上传到hive中:

hive> load data inpath "/input/data" overwrite into table xuexi.student;

Loading data to table xuexi.student

Table xuexi.student stats: [numFiles=1, numRows=0, totalSize=241, rawDataSize=0]

OK

Time taken: 2.272 seconds

hive>

此时切换到slave3节点中看,集群中data文件就不见了

HiveQL操作详解

Hive可以通过脚本的形式运行

创建run.sh

[root@slave3 ~]# cd /root/app

[root@slave3 app]# vim run.sh

[root@slave3 app]# chmod u+x run.sh

其中run.sh里面的内容为:

use xuexi;

select * from student;

执行此脚本:

[root@slave3 app]# hive -f ./run.sh

 

Logging initialized using configuration in jar:file:/root/app/apache-hive-1.2.2-bin/lib/hive-common-1.2.2.jar!/hive-log4j.properties

OK

Time taken: 1.245 seconds

OK

唐洪玲 女 29

颜建强 男 29

舒楠松 男 18

罗小平 男 22

杨光大 男 25

朱雨龙 男 20

陈建 男 20

张元林 男 19

王崇如 男 27

周婷婷 女 29

秦增 男 23

廖英杰 男 24

刘龙 男 19

柏雅岚 女 27

Time taken: 1.357 seconds, Fetched: 14 row(s)

说明:使用脚本运行hive命令是生产中常用的方式,务必掌握此方式!


 

分享