目录
编辑
一、数据库的基本操作
1.1 展示所有数据库
1.2 切换数据库
1.3 创建数据库
1.4 删除数据库
1.5 显示数据库信息
1.5.1 显示数据库信息
1.5.2 显示数据库详情
二、数据库表的基本操作
2.1 创建表的操作
2.1.1 创建普通hive表(不包含行定义格式)
2.1.2 创建自定义行格式的hive表
2.1.3 创建默认分隔符的hive表(^A、^B、^C)
2.1.4 创建hive的外部表(需要添加external和location的关键字)
2.1.5 创建单分区表
2.1.6 创建多分区表
2.1.7 给分区表添加分区列的值
2.1.8 删除分区列的值
2.1.9 修复分区
2.1.9.1 在hdfs创建目录并上传文件
2.1.9.2 创建外部表
2.1.9.3 查询结果(没有数据)
2.1.9.4 修复分区
2.1.9.5 再查询结果(有数据)
2.2 查看表的操作
2.2.1 查看表结构
2.2.2 查看表分区
2.2.3 查看表详细结构
2.2.4 查看表的类型
2.2.5 查看建表信息
2.3 修改表的操作
2.3.1 修改内部表为外部表
2.3.2 修改表名
2.3.3 更新列
2.3.4 新增或替换列
2.3.5 修改列名、列类型、注释
2.4 删除表的操作
2.4.1 Drop删除
2.4.2 Truncate 删除
2.4.3 drop 和truncate的区别
show databases;
use database_name;
提示:database_name 指的我们真实存在的数据库名称。
例子:use test;
语法:
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
例子:
create database test;
注意:当进入hive的命令行开始编写SQL语句的时候,如果没有任何相关的数据库操作,那么默认情况下,所有的表存在于default数据库,在hdfs上的展示形式是将此数据库的表保存在hive的默认路径下,如果创建了数据库,那么会在hive的默认路径下生成一个database_name.db的文件夹,此数据库的所有表会保存在database_name.db的目录下。
语法:
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
例子:
drop database test;
语法:desc database database_name;
例子:desc databse test;
语法:desc database EXTENDED database_name;
例子:desc databse EXTENDED test;
create table psn
(
id int,
name string,
likes array,
address map
)
create table psn2
(
id int,
name string,
likes array,
address map
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';
create table psn3
(
id int,
name string,
likes array,
address map
)
row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003';
create external table psn4
(
id int,
name string,
likes array,
address map
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/data';
在之前创建的表都属于hive的内部表(psn,psn2,psn3),而psn4属于hive的外部表,
内部表跟外部表的区别:
1、hive内部表创建的时候数据存储在hive的默认存储目录中,外部表在创建的时候需要制定额外的目录
2、hive内部表删除的时候,会将元数据和数据都删除,而外部表只会删除元数据,不会删除数据
应用场景:
内部表:需要先创建表,然后向表中添加数据,适合做中间表的存储
外部表:可以先创建表,再添加数据,也可以先有数据,再创建表,本质上是将hdfs的某一个目录的数据跟 hive的表关联映射起来,因此适合原始数据的存储,不会因为误操作将数据给删除掉
create table psn5(id int,name string,likes array,address map)
partitioned by(gender string)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';
create table psn6
(
id int,
name string,
likes array,
address map
)
partitioned by(gender string,age int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';
注意:
1、当创建完分区表之后,在保存数据的时候,会在hdfs目录中看到分区列会成为一个目录,以多级目录的形式存在
2、当创建多分区表之后,插入数据的时候不可以只添加一个分区列,需要将所有的分区列都添加值
3、多分区表在添加分区列的值得时候,与顺序无关,与分区表的分区列的名称相关,按照名称就行匹配
alter table table_name add partition(col_name=col_value)
alter table table_name drop partition(col_name=col_value)
注意:
1、添加分区列的值的时候,如果定义的是多分区表,那么必须给所有的分区列都赋值
2、删除分区列的值的时候,无论是单分区表还是多分区表,都可以将指定的分区进行删除
在使用hive外部表的时候,可以先将数据上传到hdfs的某一个目录中,然后再创建外部表建立映射关系,如果在上传数据的时候,参考分区表的形式也创建了多级目录,那么此时创建完表之后,是查询不到数据的,原因是分区的元数据没有保存在mysql中,因此需要修复分区,将元数据同步更新到mysql中,此时才可以查询到元数据.
hdfs dfs -mkdir /ning
hdfs dfs -mkdir /ning/age=10
hdfs dfs -mkdir /ning/age=20
hdfs dfs -put /root/data/data /ning/age=10
hdfs dfs -put /root/data/data /ning/age=20
create external table psn11
(
id int,
name string,
likes array,
address map
)
partitioned by(age int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/ning';
select * from psn11;
msck repair table psn11;
select * from psn11;
desc formatted psn19;
show partitions psn19;
desc formatted psn19;
desc extended psn19;
desc formatted psn19;
show create table psn11;
语法:alter table table_name set TBLPROPERTIES('EXTERNAL'='true');
例子:
alter table psn3 set TBLPROPERTIES('EXTERNAL'='true');
查询下表结构,看下表的类型:
desc formatted psn3;
表的类型变成了EXTERNAL_TABLE,变成了外部表(EXTERNAL_TABLE 是外部表,MANAGED_TABLE是内部表)。
语法:alter table table_name RENAME to new_table;
例子:
alter table psn3 rename to new_psn3;
通过查看数据库中的表,我们发现表psn3成功修改为表new_psn3。
语法:alter table table_name CHANGE COLUMN col_old_name col_new_name column_type;
例子:
# 我们把new_psn3这张表中的name字段修改成new_name字段,类型是string类型。
alter table new_psn3 change column name new_name string;
通过查看表结构,我们发现原本的name字段,已经成功修改成了new_name字段,且类型是string 类型。
语法:alter table table_name ADD|REPLACE COLUMNS (col_name data_type.........);
新增列例子:
#我们往new_psn3这张表中新增一个列,叫age,类型int 类型。
alter table new_psn3 add columns(age int);
替换列例子:
#我们将new_psn3这张表中的字段进行替换。
alter table new_psn3 replace columns(id int,name string,likes array,address map);
通过查看表,我们知道,表中的字段,被我们成功替换了。
语法:alter table table_name change old_column_name new_column_name new_column_type comment '注释';
例子:
#我们将new_psn3 中的name 修改成new_name,类型还是string ,添加注释“名称”
alter table new_psn3 change name new_name string comment '名称';
语法:`DROP TABLE [IF EXISTS] table_name;`
例子:
drop table if existt psn2;
提示:使用drop命令删除普通表,hdfs的数据和hive中的元数据会被删除,但是删除外部表时,只会删除元数据,不会删除hdfs中的数据。
语法:
`TRUNCATE [TABLE] table_name [PARTITION partition_spec];`
`partition_spec:` (partition_column = partition_col_value, partition_column = partition_col_value, ...)
例子:
在删除之前,我看下我的psn20表存储的数据:
可以看多,psn20有两个分区,分别是age=10,age=20.
#删除表中指定分区数据
truncate table psn20 partition(age=10);
删除age=10这个分区后,我们发现psn20这个表只剩下age=20的分区数据。
# 删除所有分区数据
truncate table psn20;
提示:
1、从表或分区中删除所有行。可以指定partition_spec一次截断多个分区,省略partition_spec将截断表中的所有分区(即分区表可以通过指定partition_spec删除表中指定的分区数据,如果不指定,则删除整个表中的分区数据)。
2、使用Truncate删除外部表会报错,因为外部表不被Hive所管理,被文件存储系统hdfs管理,所以需要先去hdfs中删除数据文件,再使用Truncate删除表元数据。
1)drop 操作会删除元数据(即表不存在)和文件系统的数据(只针对普通表)
2)truncate操作只是会删除表中的数据,不会删除表的元数据(即表还存在,只针对普通表)
3)关于外部表,drop操作只会删除元数据,不会删除文件系统的数据,而truncate操作不能直接操作外部表,因为外部表的不属于Hive管理,直接操作会报错。
更多详细内容,可参考Hive官网DDL语句部分说明文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
好了,今天Hive基本SQL操作(DDL篇)的相关内容就分享到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!