创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
- 创建一个数据库 text
hive (default)> create database text;
OK
Time taken: 4.279 seconds
- 避免数据库存在而报错,可以使用 if not exists来做判断,避免产生异常。
不使用 if not exists 情况
hive (default)> create database text;
FAILED: Execution Error, return code 1 from
org.apache.hadoop.hive.ql.exec.DDLTask. Database text already exists
使用 if not exists 情况
hive (default)> create database if not exists text;
OK
Time taken: 0.09 seconds
- 指定数据库在 HDFS 存储的位置。
默认的存储位置:
如:数据库 text
hive (default)> dfs -ls /user/hive/warehouse;
Found 1 items
drwxr-xr-x - atguigu supergroup 0 2021-05-24 12:33 /user/hive/warehouse/text.db
语法:create database [if not exists] database_name location 'hdfs地址';
hive (default)> create database if not exists text2 location '/text';
OK
Time taken: 0.16 seconds
查看 /text,在 / 目录下就有了一个 text目录,目录中就是用于存放text表信息的。
hive (default)> dfs -ls /;
Found 3 items
drwxr-xr-x - atguigu supergroup 0 2021-05-24 13:03 /text
drwx-wx-wx - atguigu supergroup 0 2021-05-24 10:14 /tmp
drwxr-xr-x - atguigu supergroup 0 2021-05-24 12:33 /user
- 查看数据库的存放位置
上面说了,除了默认的存储在 /user/hive/warehouse/ 下外,还有自定义数据库存储位置。若我更加详细的知道数据库的存储位置,需要使用到 desc 关键字。
语法:desc database database_name;
# text2 数据库
hive (default)> desc database text2;
OK
db_name comment location owner_name owner_type parameters
text2 hdfs://hadoop102:9820/text atguigu USER
Time taken: 0.347 seconds, Fetched: 1 row(s)
------------------------------------------------------------------------------
# text 数据库
hive (default)> desc database text;
OK
db_name comment location owner_name owner_type parameters
text hdfs://hadoop102:9820/user/hive/warehouse/text.db atguigu USER
Time taken: 0.078 seconds, Fetched: 1 row(s)
很明显的看到,各个数据库的存储位置。
查询数据库
- 显示所有数据库
查看当前hive下有多少数据库;语法 show databases;
hive (default)> show databases;
OK
database_name
default
text
text2
Time taken: 0.071 seconds, Fetched: 3 row(s)
- 过滤
使用 like 关键字,进行数据过滤。 语法:show databases like ‘模糊匹配’;
*
匹配符号,匹配所有。
hive (default)> show databases like 't*';
OK
database_name
text
text2
Time taken: 0.052 seconds, Fetched: 2 row(s)
- 查看数据库详情
显示数据库信息。
语法:desc database 数据库名称
hive (default)> desc database text;
OK
db_name comment location owner_name owner_type parameters
text hdfs://hadoop102:9820/user/hive/warehouse/text.db atguigu USER
Time taken: 0.115 seconds, Fetched: 1 row(s)
显示数据库详细信息。extended
语法:desc database extended 数据库名称
hive (default)> desc database extended text;
OK
db_name comment location owner_name owner_type parameters
text hdfs://hadoop102:9820/user/hive/warehouse/text.db atguigu USER
Time taken: 0.115 seconds, Fetched: 1 row(s)
感觉没啥区别有没有?dbproperties 会看出 extended 差距。
- 切换当前数据库
使用 use 关键字切换到,指定到数据库。
切换数据库前 (default)
hive (default)>
切换到text数据库
hive (default)> use text;
OK
Time taken: 0.11 seconds
hive (text)> # 已经是text数据库了
修改数据库
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
hive (default)> alter database text set dbproperties('db_name'='text3');
OK
Time taken: 0.046 seconds
查看text数据库信息(不加 extended)
语法:desc database <库名>
hive (default)> desc database text;
OK
db_name comment location owner_name owner_type parameters
text hdfs://hadoop102:9820/user/hive/warehouse/text.db atguigu USER
Time taken: 0.024 seconds, Fetched: 1 row(s)
查看text数据库信息(加 extended)
语法:desc database extended <库名>
hive (default)> desc database extended text;
OK
db_name comment location owner_name owner_type parameters
text hdfs://hadoop102:9820/user/hive/warehouse/text.db atguigu USER {db_name=text3, createtime=20170830}
Time taken: 0.02 seconds, Fetched: 1 row(s)
删除数据库
基本方式删除数据库
语法:drop database <库名>
hive (default)> drop database text;
OK
Time taken: 0.157 seconds
若数据库不存在,使用drop database ... 可能会报错,通常情况可以加一个判断 if exists
hive (default)> drop database if exists text;
OK
Time taken: 1.314 seconds
hive (default)>
如果数据库不为空,可以采用 cascade 命令,强制删除
语法:drop database [if exists] <库名> cascade ;
hive (default)> drop database if exists text cascade;
OK
Time taken: 0.261 seconds
建表
管理表
理论:
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
创建普通表:
语法: create table [if not exists] <表名>(字段1 字段类型,字段2,字段类型,...)
hive (default)> create table student(id int,name string,age int);
OK
Time taken: 1.249 seconds
安全的建表方式:if not exists
hive (default)> create table if not exists student(id int,name string,age int);
OK
Time taken: 0.099 seconds
根据查询结果创建表(查询的结果会添加到新创建的表中): 关键字 as
- 准备一张表(student)
hive (default)> select * from student;
OK
student.id student.name student.sex student.age
1001 张三 男 18
1002 李四 男 20
1003 村花 女 19
1004 花花 男 24
1005 红鹤 男 30
Time taken: 0.353 seconds, Fetched: 5 row(s)
- 将student表的查询结果创建一个张新的表
1) 语法:create table [if not exists] <表名> as <表查询>
2) 运行日志
create table if not exists student2 as select name,sex,age from student;
hive (default)> create table if not exists student2 as select name,sex,age from student;
Query ID = atguigu_20210525135948_1fa5b95a-1530-4b55-b384-7401d57b3fee
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1621902061047_0002, Tracking URL = http://hadoop103:8088/proxy/application_1621902061047_0002/
Kill Command = /opt/module/hadoop-3.1.3/bin/mapred job -kill job_1621902061047_0002
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2021-05-25 14:00:14,487 Stage-1 map = 0%, reduce = 0%
2021-05-25 14:00:34,785 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 7.56 sec
MapReduce Total cumulative CPU time: 7 seconds 560 msec
Ended Job = job_1621902061047_0002
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to directory hdfs://hadoop102:9820/user/hive/warehouse/.hive-staging_hive_2021-05-25_13-59-48_759_2955781496070615672-1/-ext-10002
Moving data to directory hdfs://hadoop102:9820/user/hive/warehouse/student2
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Cumulative CPU: 7.56 sec HDFS Read: 4993 HDFS Write: 142 SUCCESS
Total MapReduce CPU Time Spent: 7 seconds 560 msec
OK
name sex age
Time taken: 47.919 seconds
3) 查询 student2 :
hive (default)> select * from student2;
OK
student2.name student2.sex student2.age
张三 男 18
李四 男 20
村花 女 19
花花 男 24
红鹤 男 30
Time taken: 0.348 seconds, Fetched: 5 row(s)
根据已经存在的表结构创建表;关键字 like
语法:create tabel [if not exists] <表名> like <已存在的表>
案例:create table if not exists student3 like student;
hive (default)> create table if not exists student3 like student;
OK
Time taken: 0.307 seconds
查询 student3 表;返回的只有student表结构,并没有数据。
hive (default)> select * from student3;
OK
student3.id student3.name student3.sex student3.age
Time taken: 0.347 seconds
if not exists 为可选项,保证创建表时不会出现异常。
总结:
描述 | as | like |
---|---|---|
数据结构 | 将查询的结果生成新表的数据结构 | 直接将表的数据结构生成新表的数据结构 |
数据 | 查询出来的结果,将成为新表的数据结果 | 生成的只有表结构,并无表数据 |
方式 | as 后面跟的是查询语句 | like 后面跟的是表名 |
外部表
- 理论
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
- 管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
- 实操案例
1)准备数据 student.txt
1001 张三 男 18
1002 李四 男 20
1003 村花 女 19
1004 花花 男 24
1005 红鹤 男 30
2)加载数据到HDFS 中,必须上传到目录中。
hive (default)> dfs -put ~/student.txt /student
3)创建外部表
语法:create table [if not exists] <表名>(字段1 字段类型,字段2 字段类型,...);
案例:使用关键字 ,创建外部表的同时并导入数据。
create external table if not exists
student(id int,name string,sex string,age int)
row format delimited fields terminated by '\t' location '/student';
4)结果查询
hive (default)> select * from student;
OK
student.id student.name student.sex student.age
1001 张三 男 18
1002 李四 男 20
1003 村花 女 19
1004 花花 男 24
1005 红鹤 男 30
Time taken: 0.133 seconds, Fetched: 5 row(s)
如何管理表和外部表?
使用 desc formatted <表名>; 可以查看表类型
管理表:
Table Type: MANAGED_TABLE
外部表:
Table Type: EXTERNAL_TABLE
管理表与外部表的互相转换
语法:alter table <表名> set tblproperties('EXTERNAL'='TRUE/FALSE');
描述:EXTERNAL 默认为 FALSE 也就是管理表,若需要将管理表设置成外部表,可以将其设置成 TRUE,反之为FALSE。
- 将管理表修改成外部表
alter table student set tblproperties('EXTERNAL'='TRUE');
类型查看
hive (default)> desc formatted student;
Table Type: EXTERNAL_TABLE
- 将外部表设置成管理表
alter table student set tblproperties('EXTERNAL'='FALAE');
类型查看
hive (default)> desc formatted student;
Table Type: MANAGED_TABLE
修改表
重命名表
语法:
ALTER TABLE <旧表名>RENAME TO <新表名>
案例:将 student 修改成 new_student
hive (default)> alter table student rename to new_student;
OK
Time taken: 0.165 seconds
查询new_student:select * from new_student;
hive (default)> select * from new_student;
OK
new_student.id new_student.name new_student.sex new_student.age
1001 张三 男 18
1002 李四 男 20
1003 村花 女 19
1004 花花 男 24
1005 红鹤 男 30
Time taken: 0.133 seconds, Fetched: 5 row(s)
增加/修改/替换列信息
- 查看表结构
hive (default)> desc new_student;
OK
col_name data_type comment
id int
name string
sex string
age int
Time taken: 0.045 seconds, Fetched: 5 row(s)
- 添加列
语法:alter table <表名> add columns(<字段名称> <字段类型>);
案例:在 new_student 表中添加 phone 字段
hive (default)> alter table new_student add columns(phone string);
OK
Time taken: 0.104 seconds
查看表结构:
hive (default)> desc new_student;
OK
col_name data_type comment
id int
name string
sex string
age int
phone string
- 更新列
语法:alter table <表名> change column <旧列名> <新列名> <类型>;
案例:将 new_student 中的 phone 字段修改成 phone2。
hive (default)> alter table new_student change column phone phone2 string;
OK
Time taken: 0.117 seconds
查看表结构:
hive (default)> desc new_student;
OK
col_name data_type comment
id int
name string
sex string
age int
phone2 string
Time taken: 0.091 seconds, Fetched: 5 row(s
- 替换列
语法:alter table <表名> replace columns(<字段1> <类型>, <字段2> <类型>,...);
描述:,replace 将替换掉表中原有的字段。
准备一张测试表:text2,
hive (default)> desc text2;
OK
col_name data_type comment
id int
name string
age int
address string
Time taken: 0.038 seconds, Fetched: 4 row(s)
替换 text2 中的表结构
hive (default)> alter table text2 replace columns(name string,age string,phone string);
OK
Time taken: 0.118 seconds
查看表结构
hive (default)> desc text2;
OK
col_name data_type comment
name string
age string
phone string
Time taken: 0.042 seconds, Fetched: 3 row(s)
注意:类型必须保持一致,可能会报错
hive (default)> alter table text2 replace columns(name string,age int,phone string);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions :
age
删除表
语法: drop table
案例: drop table if exists text2;
hive (default)> drop table if exists text2;
OK
Time taken: 0.153 seconds
清空表
语法:truncate table <表名>;
案例:
hive (default)> truncate table student;
OK
Time taken: 0.086 seconds
管理表和外部表总结
场景 | 管理表 | 外部表 |
---|---|---|
表类型 | MANAGED_TABLE | EXTERNAL_TABLE |
表删除 | 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据 | 删除该表并不会删除掉原始数据,删除的是表的元数据 |
表清空 | 使用truncate 可以清空管理表 | 不能使用 truncate 清空 外部表 |
数据管理 | 数据由Hive自身管理 | 数据由HDFS管理 |