首先开启Hadoop
服务,然后开启Hive
服务:
[wzq@hadoop102 hive-3.1.2]$ myhadoop.sh start
[wzq@hadoop102 hive-3.1.2]$ hiveservices.sh start
[wzq@hadoop102 hive-3.1.2]$ hive
hive (default)> create database if not exists db_hive;
hive (default)> use db_hive;
hive (db_hive)> show tables;
hive (db_hive)> select * from student1;
OK
student1.id student1.name
1001 ss1
1002 ss2
1003 ss3
1004 ss4
1005 ss5
1006 ss6
Time taken: 3.236 seconds, Fetched: 6 row(s)
将查询结果导出到本地(加local关键字):
hive (db_hive)> insert overwrite local directory
> '/opt/module/hive-3.1.2/datas/'
> select * from student1;
从下面的结果可以看到加了overwrite
关键字,原来这个文件夹的所有内容都被覆盖了
不加local关键字将查询结果导出到HDFS上:
hive (db_hive)> insert overwrite directory '/exprot/data/'
> select * from student;
当然也可以指定格式,格式化表中数据到本地或HDFS:
hive (db_hive)> insert overwrite local directory
> '/opt/module/hive-3.1.2/datas'
> row format delimited fields terminated by ','
> select * from student1;
这个命令之前在Hadoop
的HDFS
命令行操作已经用了很多次了,就不再展开叙述
hive (db_hive)> dfs -get /exprot/data/ /opt/module/hive-3.1.2/datas
之前在Hive 常用交互命令中也写到过通过使用hive -e command line
通过这样执行命令,也不再展开叙述
[wzq@hadoop102 datas]$ hive -e "select * from db_hive.student1" > 000000_0
Export
对应第二章节数据导入的Import
,通常用于两个Hadoop平台集群之间Hive表的迁移,因为使用Export
的时候会把元数据也进行打包:
hive (db_hive)> export table student1
> to '/export/student';
Sqoop
是一个工具,这个后期有专门的blog
学习该工具怎么使用,这里不再赘述
使用Truncate
关键字会删除表内所有的数据,但会保留表的结构。只适用于管理表(内部表),不适用于外部表
hive (db_hive)> truncate table student1;
这个就很重要了,在以后的操作中会经常使用Load
在之前的blog中我们使用
HDFS
的命令行去上传文件,但是这会有个问题,HQL
的一些函数不会正常工作,比如:表里面有5条数据,但是使用
select count(*) from student1
结果只显示了0
条记录:Hive会在元数据存储的数据库中建立一个表,每个Hive表对应在Mysql中都有一个记录,该记录又有自己的外键关联,我们看一下student1表的外键关联:
可以看到这块,我们在HDFS中明明有一个文件,在这里却显示没有,说明了直接执行Hadoop的put命令,并不会修改Hive的表,所以count(*)的时候自然也不会觉察到有文件在了。所以我们使用
Load
装载数据。
Load
基本语法(其中带有[]
是可选项):
hive > load data [local] inpath '数据的path' [overwrite]
> into table 表名 [partition (partcoll=val1,...)];
local
:如果加该字段表示从本地加载数据到表,不加就表示从HDFS加载数据到表(执行的是剪切工作)overwrite
:是否覆盖表中数据inpath '数据的path'
:这一块可以写绝对路径也可以写相对路径,本人觉得写绝对路径比较好,因为如果在hive的窗口工作时间长了,自己也不知道是在哪里进的hive了。partition
:分区表,后面的blog会专门讨论
我们创建一张表:
hive (db_hive)> create table student4 like student1;
该表现在拥有student1
表的所有数据
加载本地文件到该表:
hive (db_hive)> load data local inpath '/opt/module/hive-3.1.2/datas/student.txt'
> into table student4;
加载HDFS文件到该表:
hive (db_hive)> load data inpath '/student.txt'
> into table student4;
Note:如果加载HDFS文件到表,执行的是剪切操作
加载数据并覆盖表中已有数据:
hive (db_hive)> load data local inpath '/opt/module/hive-3.1.2/datas/student.txt'
> overwrite into table student4;
表中数据已被覆盖
创建一张表:
hive (db_hive)> create table student5(
> id int,name string)
> row format delimited fields terminated by ',';
基本模式向表中插入数据:(和sql很相似)
hive (db_hive)> insert into student5 values(1,'wzq'),(2,'wtt');
根据单张表的查询结果插入:
insert into
:追加数据insert overwrite
:覆盖表中数据
hive (db_hive)> insert overwrite table student5
> select id,name from student1;
根据查询结果创建一张表,比如:
hive (db_hive)> create table if not exists student6
> as select id,name from student1;
创建表的时候可以指定location
指定hdfs路径导入数据,这里最好创建外部表:
hive (db_hive)> create external table if not exists student6(
> id int,name string)
> row format delimited fields terminated by ','
> location '/export/student/data';
刚刚提到了Export
导出数据到HDFS,它与Import一起使用,用于两个Hadoop集群之间Hive表的搬家:
hive (db_hive)> import table student7
> from '/user/hive/warehouse/export/student';
- 尚硅谷Hive学习视频
- Apache Hive官网