全网最细之HiveQL语句操作
HiveQL语句操作
- 关键字尽量大写 但是本人小写容易记忆 所以本篇为小写
- --------------------------------------------------------------------------
- 数据库
- 创建一个数据库
- 查看数据库
- 修改数据库信息
- 删除数据库
- --------------------------------------------------------------------------
- 普通表
- 创建表
- 查看表
- 修改表名
- 添加n列
- 修改表
- 修改位置
- 单独修改列名 数据类型
- 替换列
- 删除n个字段
- 修改表的注释
- 删除表
- 清空表数据
- 内部表(管理表)和 外部表
- 两者的区别
- 相互转换
- --------------------------------------------------------------------------
- 分区表
- 创建分区表
- 显示所有分区
- 添加分区
- 往分区里面添加数据
- 查询分区
- 删除分区
- 修复分区
- 移动分区
- --------------------------------------------------------------------------
- 分桶表
- 什么是分桶表?
- 分桶表和分区表的区别
- 创建分桶表
- 查看分桶表
- --------------------------------------------------------------------------
- 临时表
- 创建临时表
- --------------------------------------------------------------------------
- 视图
- 视图的创建
- 查看视图
- 修改视图属性
- 修改视图
- 删除视图
- --------------------------------------------------------------------------
- 索引
- 创建索引
- 查看索引
- 重建索引
- 删除索引
关键字尽量大写 但是本人小写容易记忆 所以本篇为小写
--------------------------------------------------------------------------
数据库
下方数据库名统一为:db (我难得打中文)
创建一个数据库
#创建一个数据库,在HDFS上的默认路径为user/hive/warehouse/*.db
create database db;
#可以用 if exists 判断是否存在(存在则不创建)
create database if not exists db;
#创建一个数据库 指定存放的路径 这里我使用的是自己的存放路径
create database db location "/user/hive/warehouse";
#
查看数据库
#显示所有数据库
show databases;
--模糊搜索
show database like 'it*';
--查看信息
desc database db;
--查看`详细信息` 信息
desc database extended db;
--切换当前数据库
use db
修改数据库信息
可以修改一些附加的信息,但是不能修改
元数据信息
--给数据库添加信息
alter database db set dbproperties("createtime"="2022-04-20");
删除数据库
--删除一个 空的!!! 数据库
drop database db;
--还是最好用if exists 判断是否存在
drop database if exists db;
--如果数据库不为空 可以选择使用 cascade 强制删除
drop database db cascade;
--------------------------------------------------------------------------
普通表
老规矩 表名为: tb
创建表
--创建一张表
create table tb(id int,name string);
--创建一张外部表
create external tb(id int,name string);
--创建表并设置表中数据的分隔符(以制表符为例)
--复制代码时候 记得把注释删了
create table tb(name string,friends array<string>,children map<string, int>,address struct<street:string, city:string>
)
row format delimited
fields terminated by ',' /* 列分隔符 */
collection items terminated by '_' /* MAP STRUCT 和 ARRAY 的分隔符(数据分割
符号) */
NUll defined as '' 数据中有空值的时候需要转换为hdfs识别的到的 null
map keys terminated by ':' /* MAP 中的 key 与 value 的分隔符 */
lines terminated by '\n' /* 行分隔符 */
stored as textfile; /*存储格式*/
查看表
--查看表
>1:desc tb
>--查看详细信息
>2:desc formatted tb
修改表名
>alter table 旧表名 rename to 新表名
添加n列
>1、一次增加一个列(默认添加为最后一列,分区字段之前,用逗号风格多列)
alter table table_name add columns (new_col INT);
2、可以一次增加多个列
alter table table_name add columns (c1 INT,c2 STRING);
3、添加一列并增加列字段注释
alter table table_name add columns (new_col INT comment 'a comment');
修改表
修改位置
>将列a1的名称更改为a2,将其数据类型更改为字符串,并将其放在列b之后:
alter table testa change a1 a2 string after b;
>放在第一排
>alter table testa change a2 a3 string first;>注意:
>列位置更换后数据位置还是不动的,`若想让数据跟着字段一起移动,需更新表数据,`
使用`insert overwrite table` 从表中将移动之前对应的数据插入到移动之后对应的字段中
单独修改列名 数据类型
>alter table 表名 change column 原列名 新列名 新数据类型
替换列
会删除原来的所有列,也就是把所有的列替换为一个字段
>alter table 表名 replace columns (列名 数据类型)
删除n个字段
alter table tb drop column id,drop column name;
修改表的注释
>alter table testa set tblproperties( "comment" = "new comment" )
删除表
>1:drop table 表名
>--purge 强制删除 就是放在最后面
>2:drop table 表名 purge
清空表数据
truncate table tb;
内部表(管理表)和 外部表
两者的区别
删除时,
内部表会把元数据和具体数据都删除
,但是外部表只会删除元数据
相互转换
注意:这里你第一眼会很眼熟,切记!!要大写大写大写!不然就是加附加信息了!
其实就是 external 等于 true或者false
--转换为外部表
alter table tb set tblproperties('EXTERNAL'='TRUE');
--转换为内部表
alter table tb set tblproperties('EXTERNAL'='FAlSE');
--------------------------------------------------------------------------
分区表
分区是HDFS上对应一个独立的文件夹,属于元数据,但用法相当于一个字段,可以用来过滤
数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间,主要包括两种分区形式:水平分区与垂直分区。水平分区是对表进行行分区。而垂直分区是对列进行分区,一般是通过对表的垂直划分来减少目标表的宽度,常用的是水平分区.
创建分区表
1:分区字段不能和表字段重名
2::一但创建了分区字段,就无法进行修改和添加
--创建一个表,并设置以moth字段分区
create table student(id int,name string)
partitioned by(month string);
--二级分区也即使多级文件夹
create table student(id int,name string)
pertitioned by(month string,day string);
显示所有分区
show partitions tb;
添加分区
--往分区字段表里添加一个分区
alter table student add partition(month='202003')
--往分区里面添加多个分区(用空格分隔)
alter table student add partition(month='2022') partition(month='2023');
往分区里面添加数据
--加上 partition() 指定分区
load data local inpath'/opt/file.txt' into table tb partition(month='202003');
insert into table tb partition(month='202003') values('4','20');
****************************************************************************
load data [local] inpath '数据的 path' [overwrite] into table tablename [partition (partcol1=val1,…)];
查询分区
select * from tb where month='202003';
select * from tb where month='202003' and day='20';
删除分区
--删除一个分区的表里面的分区
alter table tb drop partition(month='202003');
--删除分区表里面的多个分区(以逗号分隔)
alter table tb drop partition(month='202003'),partition(month='202004');
修复分区
如果数据是通过HDFS直接上传到分区目录,如果分区没定义,则会查询不到刚上传的数据
-- 修复命令
msck repair table student;
-- 也可以直接让此目录成为分区目录(这里以month='20200316'为例)
alter table student add partition(month='20200316');
移动分区
移动分区可以将分区表A中的表移动到具有相同结构的分区表B中,值得注意的是表B中不能存在表A中要移动的分区
-- 移动分区
--语法
alter table 表名>被插入的表 exchange partition(分区名) with table 表名>提供分区的表
--例子
--将表a的二级分区province=HuBei/city=WuHan移动分区表b中:
alter table b exchange partition (province=HuBei,city=WuHan) with table a
--------------------------------------------------------------------------
分桶表
什么是分桶表?
分桶是将数据集分解成更容易管理的若干部分的一个技术,是比表或分区更为细粒度的数据范围划分。针对某一列进行桶的组织,对列值哈希,然后除以桶的个数求余,决定将该条记录存放到哪个桶中。
常用于:
- 获得更高的查询处理效率
- 抽样调查
分桶表和分区表的区别
分区表提供了一个隔离数据和优化查询的便利方式。但是在实际场景下,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive还可以进一步组织成桶,也就是更为细粒度的数据范围划分。
小结一波:
- 分桶对数据的处理比分区更加细粒度化;
- 分桶和分区两者不干扰,可以把分区表进一步分桶;
- 分区针对的是数据的存储路径;分桶针对的是数据文件。
创建分桶表
create table test_bucket (
id int comment 'ID',
name string comment '名字'
)
clustered by(id) into 4 buckets
查看分桶表
desc formatted test_bucket;
--------------------------------------------------------------------------
临时表
作为临时表创建的表将只对当前会话可见
。数据将存储在用户的scratch目录(临时目录)中,并在会话结束时删除
。
如果用数据库中已经存在的永久表的数据库/表名创建了一个临时表
,那么在该会话中,对该表的任何引用
都将解析为临时表
,而不是永久表。如果不删除临时表或将其重命名为不冲突的名称,用户将无法在该会话中访问原始表。
临时表存在如下限制:
- 不支持分区列
- 不支持创建索引
Hive的临时表在数据加载的过程中会频繁使用到,对于复杂的业务逻辑,可以将数据先存储在临时表,然后再从临时表取值进行进一步计算。
创建临时表
create table temporary temporary1(id int,name string);
--------------------------------------------------------------------------
视图
在 Hive 中可以使用 CREATE VIEW 创建视图,如果已存在具有相同名称的表或视图
,则会抛出异常
,建议使用 IF NOT EXISTS 预做判断。在使用视图时候需要注意以下事项:
- 视图是
只读
的,不能用作 LOAD / INSERT / ALTER 的目标; - 在创建视图的时候,视图就已经固定,对基表的后续更改(如添加列)将不会反映在视图;
- 删除基表并不会删除视图,需要手动删除视图;
- 视图可能包含 ORDER BY 和 LIMIT 子句。如果引用视图的查询语句也包含这类子句,其执行优先级低于视图对应字句。例如,视图
custom_view 指定 LIMIT 5
,查询语句为select * from custom_view LIMIT 10
,此时结果最多返回 5 行。 - 创建视图时,如果未提供列名,则将从 SELECT 语句中自动派生列名;
- 创建视图时,如果 SELECT 语句中包含其他表达式,例如 x + y,则列名称将以_C0,_C1 等形式生成;
视图的创建
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name -- 视图名称[(column_name [COMMENT column_comment], ...) ] --列名[COMMENT view_comment] --视图注释[TBLPROPERTIES (property_name = property_value, ...)] --额外信息AS SELECT ...;create view if not exists 数据库名.视图名
字段名 字段注释 --可选
comment 视图注释
tblproperties (注释名=注释值)
as select 用于指定查询的语句
查看视图
--查看视图
desc 视图名;
--查看详细信息
desc formatted 视图名;
--查看数据库中的视图
show views;
修改视图属性
alter view viewname set tblproperties(property1=propervalue1,property2=propervalue2,。。。。);
修改视图
alter view viewname as 新的查询;
删除视图
drop view if not exists 视图名;
--------------------------------------------------------------------------
索引
创建索引
CREATE INDEX index_name --索引名称ON TABLE base_table_name (col_name, ...) --建立索引的列AS index_type --索引类型[WITH DEFERRED REBUILD] --重建索引[IDXPROPERTIES (property_name=property_value, ...)] --索引额外属性[IN TABLE index_table_name] --索引表的名字[[ ROW FORMAT ...] STORED AS ... | STORED BY ...] --索引表行分隔符 、 存储格式[LOCATION hdfs_path] --索引表存储位置[TBLPROPERTIES (...)] --索引表表属性[COMMENT "index comment"]; --索引注释--简写↓
create index index_name on table 建立索引的表(表的字段)
as 索引的类型
[with deferred rebuild] --可选
[indexproperties(property_name1=property_value,....)] --索引额外属性 可选
[in table 自定义我们索引表的名字] --可选[row format ... stored as ... stored by --行分隔符、存储格式 可选
]
[location hdfs上的路径] --可选
[tblproperties (...)] --可选
[comment 'this is indextable'] -- 索引注释 可选
查看索引
show [formatted] 表名
重建索引
在这里插入代码片
删除索引
drop index 索引名;
全网最细之HiveQL语句操作相关推荐
- HiveQL数据操作
文章目录 Hive--HiveQL数据操作 1.向管理表中插入数据 2.通过查询语句向表中插入数据 3.单个查询语句中创建表并加载数据 4.导出数据 Hive--HiveQL数据操作 1.向管理表中插 ...
- “保姆级”车载CAN总线教程(二)-堪称全网“最细”系列
目录 1.CAN总线的帧类型 1.1数据帧 1.2错误检测与错误帧 2.位填充机制 上节从宏观上对CAN总线的发展及工作原理等进行了介绍,本节内容将是整个CAN总线的核心内容,即可谓之"硬菜 ...
- 米联客FDMA及其控制器代码逐行讲解,全网最细,不接受反驳
米联客FDMA及其控制器代码逐行讲解,全网最细,不接受反驳 对于做图像处理的兄弟来说,图像缓存是基本操作,一般是图像三帧缓存于DDR3,然后再读出显示,DDR3操作很复杂,所以Xilinx官方出了个M ...
- 虚拟内存管理加拓展(全网最细)
写在前面:我是[程序员宝藏]的宝藏派发员,致力于创作原创干货.我热爱技术.热爱开源与分享,创作的[计算机基础面试问题]系列文章和[计算机基础主干知识]系列文章广受好评!后期会创作更多优质原创系列文章! ...
- JAVA中用 SQL语句操作小结
1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1, ...
- MySQL数据库https接口_第三章 mysql 数据库接口程序以及SQL语句操作
mysql 数据库接口程序以及SQL语句操作 用于管理数据库: 命令接口自带命令 DDL:数据定义语言(create drop ) DCL: 数据控制语言(grant revoke) DML: 数据 ...
- SQL语句操作大全(本文系转载)
SQL语句操作大全(本文系转载) SQL语句操作大全(本文系转载) --通过知识共享树立个人品牌. 本文分为以下六个部分: 基础部分 提升部分 技巧部分 数据开发-经典部分 SQL Server基本函 ...
- django使用mysql原始语句,Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...
- django mysql sql语句_Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...
最新文章
- 我对变量产生了这些想法
- SpringBoot高级-缓存-RedisTemplate序列化机制
- Mysql学习笔记(三)运算符和控制流函数
- python云计算服务_python 云计算平台
- python request timeout_Python - aiohttp请求不断超时(Python - aiohttp requests continuously time out)...
- Objective C的那点小语法
- Spring简化Java开发_第1章—Spring之旅—简化Spring的java开发
- webservice helloworld案例
- 电子证书 DER PEM CRT CER
- 7.jenkins 发布邮件
- 协议——UART(RS232)
- matlab 7.0电路图,基于Multisim10和Matlab7.0的正弦稳态电路分析
- CocosCreator新手游戏开发指南(真小白)超详细 逐行注释
- CMD下载速度过慢解决方案
- Linux基础知识-命令行
- scratch编程体感游戏
- phpword 模板替换文字和图片
- Python办公自动化之PPT幻灯片自动化:使用Python制作PPT 操作PPT
- 微信商城 开发的准备工作
- 5.16--java数据类型转换及杂记
热门文章
- Unity vs UE4,虚拟现实开发引擎如何抉择?
- python+selenium百度文库ppt(爬虫)
- 你知道平板电脑有哪些用途吗?
- adb操作系统开关命令
- CMD命令大全,你知道的和不知道的都有,非常实用,C++中system的用法 (史上最详细)
- 手机综合商城app小程序模板
- windows进程管理器_Windows任务管理器缔造者:可以杀死一切进程
- learnpythonthehardway中文版_《三天搞定Python基础概念之第一天》中文版
- 2021GDCPC广东省大学生程序设计竞赛
- shell -- 字符串切片