Hive(四)DDL 数据定义

创建数据库

语法:

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];

  1. 创建一个数据库 text
hive (default)> create database text;
OK
Time taken: 4.279 seconds
  1. 避免数据库存在而报错,可以使用 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
  1. 指定数据库在 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
  1. 查看数据库的存放位置

上面说了,除了默认的存储在 /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)

很明显的看到,各个数据库的存储位置。


查询数据库

  1. 显示所有数据库

查看当前hive下有多少数据库;语法 show databases;

hive (default)> show databases;
OK
database_name
default
text
text2
Time taken: 0.071 seconds, Fetched: 3 row(s)
  1. 过滤

使用 like 关键字,进行数据过滤。 语法:show databases like ‘模糊匹配’;
* 匹配符号,匹配所有。

hive (default)> show databases like 't*';
OK
database_name
text
text2
Time taken: 0.052 seconds, Fetched: 2 row(s)
  1. 查看数据库详情

显示数据库信息。
语法: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 差距。


  1. 切换当前数据库

使用 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

  1. 准备一张表(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)
  1. 将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 后面跟的是表名

外部表

  1. 理论

因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

  1. 管理表和外部表的使用场景

每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

  1. 实操案例
    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

  1. 将管理表修改成外部表
alter table student set tblproperties('EXTERNAL'='TRUE');

类型查看

hive (default)> desc formatted student;
Table Type:             EXTERNAL_TABLE    
  1. 将外部表设置成管理表
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)

增加/修改/替换列信息

  1. 查看表结构
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)
  1. 添加列
    语法: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   
  1. 更新列
    语法: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
  1. 替换列
    语法: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管理

End...

你可能感兴趣的:(Hive(四)DDL 数据定义)