Hive的基本SQL操作(DDL篇)

2023-09-20 15:19:47

目录

​编辑

一、数据库的基本操作

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的区别


一、数据库的基本操作

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篇)的相关内容就分享到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

更多推荐

大数据开发中常用组件服务的集群管理脚本整理集合

大数据开发常用脚本整理集合大数据环境相关脚本bash运行模式说明创建shell脚本目录配置hostsSSH自动配置脚本文件同步、复制工具rsync基本用法文件同步脚步命令执行脚本节点循环简化大数据组件相关脚本Hadoop集群脚本Zookeeper集群脚本Kafaka集群脚本Flume集群脚本大数据环境相关脚本bash运

Redis分布式锁的实现方式、实现原理

目录一、分布式锁的重要性与挑战1.1分布式系统中的并发问题竞态条件数据不一致死锁二、分布式锁的基本原理与实现方式2.1分布式锁的基本概念2.2基于数据库的分布式锁原理与实现方式优缺点2.3基于缓存的分布式锁原理与实现方式优缺点三、Redis分布式锁的实现与使用3.1使用SETNX命令实现分布式锁3.2设置超时与防止死锁

前端JavaScript页面生命周期: DOMContentLoaded, load, beforeunload, unload

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录引言1.DOMContentLoaded1.1属性1.2API1.3应用场景1.4示例代码2.load2.1属性2.2API2.3应用场景3.beforeunload3.1属性3.2API3.3应用场景3.4示

Python爬虫在电商数据获取与分析中的应用

前言随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序,抓取电商平台的商品信息、价格、评论等数据。一、准备工作在开始编写爬虫程序之前,我们需要准备

爬虫技术对携程网旅游景点和酒店信息的数据挖掘和分析应用

导语爬虫技术是一种通过网络爬取目标网站的数据并进行分析的技术,它可以用于各种领域,如电子商务、社交媒体、新闻、教育等。本文将介绍如何使用爬虫技术对携程网旅游景点和酒店信息进行数据挖掘和分析,以及如何利用Selenium库和代理IP技术实现爬虫程序。概述携程网是中国领先的在线旅行服务公司,提供酒店预订、机票预订、旅游度假

CSS的学习

1.认识CSSCSS叫做"层叠样式表"“层叠样式表”样式-->大小,位置,间距,颜色,字体,表框背景…统称为"样式",描述了一个网页长什么样子~层叠-->针对一个html的元素/标签,可以同时应用多组CSS样式~~多组样式会叠加在一起~~CSS描述的是页面的样式,具体来说,就是描述一个任意一个页面的元素,大小/位置/字

【解刊】IEEE旗下Trans系列,中科院1区TOP,国人占比79.388%排名第一!(附IEEE名单)

计算机领域•好刊解读IEEETransactionsonCybernetics出版社:IEEEISSN:2168-2267eISSN:2168-2275检索数据库:SCIE&EI双检数据库检索年份:2013年出刊频率:月刊,一年一卷,一卷12期,最新一期Issue10•Oct.-2023影响因子(2022):11.8影

分类预测 | MATLAB实现WOA-CNN-LSTM-Attention数据分类预测

分类预测|MATLAB实现WOA-CNN-LSTM-Attention数据分类预测目录分类预测|MATLAB实现WOA-CNN-LSTM-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料分类效果基本描述1.MATLAB实现WOA-CNN-LSTM-Attention数据分类预测,运行环境Matla

Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 数据聚合

文章目录⛄引言一、数据聚合⛅简介⚡聚合的分类二、DSL实现数据聚合⏰Bucket聚合⚡Metric聚合三、RestAPI实现数据聚合⌚业务需求⏰业务代码实现✅效果图⛵小结⛄引言本文参考黑马分布式ElasticsearchElasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中

Qt扩展-KDDockWidgets 简介及配置

Qt扩展-KDDockWidgets简介及配置]一、概述二、编译KDDockWidgets库1.CmakeGui中选择源文件和编译后的路径2.点击Config,配置好编译器3.点击Generate4.在存放编译的文件夹输入如下命令开始编译三、qmake配置一、概述kdockwidgets是一个由KDAB组织编写的qtd

【Azure上云项目实战】 合规性的身份验证与访问控制:在 Azure 中实现符合 PCI DSS 要求的架构设计

文章目录一、开篇写在前面二、项目背景及介绍三、AzurePCIDSS项目架构及组件四、身份验证、访问控制4.1三层防御控制4.2三层部署结构五、跳板机六、与PCIDSS要求的关系七、该篇总结(重要)写在文末一、开篇写在前面各位博客阅读者们以及对云计算感兴趣的小伙伴们,微软Azure云的基础部分更新已经接近了尾声,从上周

热文推荐