Hive的基本SQL操作(DDL篇)

目录

​编辑

一、数据库的基本操作

[1.1 展示所有数据库](#1.1 展示所有数据库)

[1.2 切换数据库](#1.2 切换数据库)

[1.3 创建数据库](#1.3 创建数据库)

[1.4 删除数据库](#1.4 删除数据库)

[1.5 显示数据库信息](#1.5 显示数据库信息)

[1.5.1 显示数据库信息](#1.5.1 显示数据库信息)

[1.5.2 显示数据库详情](#1.5.2 显示数据库详情)

二、数据库表的基本操作

[2.1 创建表的操作](#2.1 创建表的操作)

[2.1.1 创建普通hive表(不包含行定义格式)](#2.1.1 创建普通hive表(不包含行定义格式))

[2.1.2 创建自定义行格式的hive表](#2.1.2 创建自定义行格式的hive表)

[2.1.3 创建默认分隔符的hive表(^A、^B、^C)](#2.1.3 创建默认分隔符的hive表(^A、^B、^C))

[2.1.4 创建hive的外部表(需要添加external和location的关键字)](#2.1.4 创建hive的外部表(需要添加external和location的关键字))

[2.1.5 创建单分区表](#2.1.5 创建单分区表)

[2.1.6 创建多分区表](#2.1.6 创建多分区表)

[2.1.7 给分区表添加分区列的值](#2.1.7 给分区表添加分区列的值)

[2.1.8 删除分区列的值](#2.1.8 删除分区列的值)

[2.1.9 修复分区](#2.1.9 修复分区)

[2.1.9.1 在hdfs创建目录并上传文件](#2.1.9.1 在hdfs创建目录并上传文件)

[2.1.9.2 创建外部表](#2.1.9.2 创建外部表)

[2.1.9.3 查询结果(没有数据)](#2.1.9.3 查询结果(没有数据))

[2.1.9.4 修复分区](#2.1.9.4 修复分区)

[2.1.9.5 再查询结果(有数据)](#2.1.9.5 再查询结果(有数据))

[2.2 查看表的操作](#2.2 查看表的操作)

[2.2.1 查看表结构](#2.2.1 查看表结构)

[2.2.2 查看表分区](#2.2.2 查看表分区)

[2.2.3 查看表详细结构](#2.2.3 查看表详细结构)

[2.2.4 查看表的类型](#2.2.4 查看表的类型)

[2.2.5 查看建表信息](#2.2.5 查看建表信息)

[2.3 修改表的操作](#2.3 修改表的操作)

[2.3.1 修改内部表为外部表](#2.3.1 修改内部表为外部表)

[2.3.2 修改表名](#2.3.2 修改表名)

[2.3.3 更新列](#2.3.3 更新列)

[2.3.4 新增或替换列](#2.3.4 新增或替换列)

[2.3.5 修改列名、列类型、注释](#2.3.5 修改列名、列类型、注释)

[2.4 删除表的操作](#2.4 删除表的操作)

[2.4.1 Drop删除](#2.4.1 Drop删除)

[2.4.2 Truncate 删除](#2.4.2 Truncate 删除)

[2.4.3 drop 和truncate的区别](#2.4.3 drop 和truncate的区别)


一、数据库的基本操作

1.1 展示所有数据库

show databases;

1.2 切换数据库

use database_name;

提示:database_name 指的我们真实存在的数据库名称。

例子:use test;

1.3 创建数据库

语法:

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的目录下。

1.4 删除数据库

语法:

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

例子:

drop database test;

1.5 显示数据库信息

1.5.1 显示数据库信息

语法:desc database database_name;

例子:desc databse test;

1.5.2 显示数据库详情

语法:desc database EXTENDED database_name;

例子:desc databse EXTENDED test;

二、数据库表的基本操作

2.1 创建表的操作

2.1.1 创建普通hive表(不包含行定义格式)

create table psn
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)

2.1.2 创建自定义行格式的hive表

create table psn2
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';

2.1.3 创建默认分隔符的hive表(^A、^B、^C)

create table psn3
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	row format delimited
	fields terminated by '\001'
	collection items terminated by '\002'
	map keys terminated by '\003';

2.1.4 创建hive的外部表(需要添加external和location的关键字)

create external table psn4
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	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的表关联映射起来,因此适合原始数据的存储,不会因为误操作将数据给删除掉

2.1.5 创建单分区表

create table psn5(id int,name string,likes array<string>,address map<string,string>)
	partitioned by(gender string)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';

2.1.6 创建多分区表

create table psn6
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(gender string,age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':';

注意:

1、当创建完分区表之后,在保存数据的时候,会在hdfs目录中看到分区列会成为一个目录,以多级目录的形式存在

2、当创建多分区表之后,插入数据的时候不可以只添加一个分区列,需要将所有的分区列都添加值

3、多分区表在添加分区列的值得时候,与顺序无关,与分区表的分区列的名称相关,按照名称就行匹配

2.1.7 给分区表添加分区列的值

alter table table_name add partition(col_name=col_value)

2.1.8 删除分区列的值

alter table table_name drop partition(col_name=col_value)

注意:

1、添加分区列的值的时候,如果定义的是多分区表,那么必须给所有的分区列都赋值

2、删除分区列的值的时候,无论是单分区表还是多分区表,都可以将指定的分区进行删除

2.1.9 修复分区

在使用hive外部表的时候,可以先将数据上传到hdfs的某一个目录中,然后再创建外部表建立映射关系,如果在上传数据的时候,参考分区表的形式也创建了多级目录,那么此时创建完表之后,是查询不到数据的,原因是分区的元数据没有保存在mysql中,因此需要修复分区,将元数据同步更新到mysql中,此时才可以查询到元数据.

2.1.9.1 在hdfs创建目录并上传文件
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
2.1.9.2 创建外部表
create external table psn11
	(
	id int,
	name string,
	likes array<string>,
	address map<string,string>
	)
	partitioned by(age int)
	row format delimited
	fields terminated by ','
	collection items terminated by '-'
	map keys terminated by ':'
	location '/ning';
2.1.9.3 查询结果(没有数据)
select * from psn11;
2.1.9.4 修复分区
msck repair table psn11;
2.1.9.5 再查询结果(有数据)
select * from psn11;

2.2 查看表的操作

2.2.1 查看表结构

desc formatted psn19;

2.2.2 查看表分区

show partitions psn19;

2.2.3 查看表详细结构

desc formatted psn19;
desc extended psn19;

2.2.4 查看表的类型

desc formatted psn19;

2.2.5 查看建表信息

show create table psn11;

2.3 修改表的操作

2.3.1 修改内部表为外部表

**语法:**alter table table_name set TBLPROPERTIES('EXTERNAL'='true');

例子:

alter table psn3 set TBLPROPERTIES('EXTERNAL'='true');

查询下表结构,看下表的类型:

desc formatted psn3;

表的类型变成了EXTERNAL_TABLE,变成了外部表(EXTERNAL_TABLE 是外部表,MANAGED_TABLE是内部表)。

2.3.2 修改表名

**语法:**alter table table_name RENAME to new_table;

例子:

alter table psn3 rename to new_psn3;

通过查看数据库中的表,我们发现表psn3成功修改为表new_psn3。

2.3.3 更新列

**语法:**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 类型。

2.3.4 新增或替换列

**语法:**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<string>,address map<string,string>);

通过查看表,我们知道,表中的字段,被我们成功替换了。

2.3.5 修改列名、列类型、注释

**语法:**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 '名称';

2.4 删除表的操作

2.4.1 Drop删除

语法:`DROP TABLE [IF EXISTS] table_name;`

例子:

drop table if existt psn2;

**提示:**使用drop命令删除普通表,hdfs的数据和hive中的元数据会被删除,但是删除外部表时,只会删除元数据,不会删除hdfs中的数据。

2.4.2 Truncate 删除

语法:

`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删除表元数据。

2.4.3 drop 和truncate的区别

1)drop 操作会删除元数据(即表不存在)和文件系统的数据(只针对普通表)

2)truncate操作只是会删除表中的数据,不会删除表的元数据(即表还存在,只针对普通表)

3)关于外部表,drop操作只会删除元数据,不会删除文件系统的数据,而truncate操作不能直接操作外部表,因为外部表的不属于Hive管理,直接操作会报错。

更多详细内容,可参考Hive官网DDL语句部分说明文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

好了,今天Hive基本SQL操作(DDL篇)的相关内容就分享到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

相关推荐
PcVue China3 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
Mephisto.java4 小时前
【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据
大数据·学习·hbase
SafePloy安策7 小时前
ES信息防泄漏:策略与实践
大数据·elasticsearch·开源
学术搬运工7 小时前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
Matrix709 小时前
HBase理论_背景特点及数据单元及与Hive对比
大数据·数据库·hbase
B站计算机毕业设计超人10 小时前
计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬虫 机器学习 深度学习 大数据毕业设计 Django Flask
大数据·爬虫·python·深度学习·机器学习·课程设计·数据可视化
Carl_奕然10 小时前
【大数据算法】MapReduce算法概述之:MapReduce基础模型
大数据·算法·mapreduce
Elastic 中国社区官方博客11 小时前
Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
飞翔的佩奇11 小时前
ElasticSearch:使用dsl语句同时查询出最近2小时、最近1天、最近7天、最近30天的数量
大数据·elasticsearch·搜索引擎·dsl
月渐盈11 小时前
SQL:给数据表字段拼接字符串
数据库·sql