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++中编写:
找不同:
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 ',';
针对最后一行说明如下:(如有疑问可以复制最后一行百度)
写完后复制粘贴到终端执行:
[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文件内容:
先上传到/root/app
再执行映射:
[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)
需注意:
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文件就不见了
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命令是生产中常用的方式,务必掌握此方式!
本文作者为BUG之神,转载请注明。