Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)
建表
基本语句格式
CREATE [external] TABLE if not exists student #默认建立内部表,加上external则是建立外部表(id int COMMENT'学号',sname string COMMENT'用户名',age int COMMENT'年龄')#字段名称,字段类型,字段描述信息 COMMENT '记录学生学号'#表的描述信息PARTITION BY (department string COMMENT'根据部门分区')#设定分区的字段名称,此字段为全新字段,不得是表中任意字段;clustered BY (id,age)#指定分桶的字段,此字段必须来自表中字段;sorted BY (id ASC, age DESC)#指定一个桶内的排序规则(按照id升序,按照年龄降序);INTO 9 buckets #指定桶的个数为9ROW FORMAT delimited fields terminated BY '\t' #指定逗号为列分隔符collection items terminated by ',' #集合中的元素间的分隔符map keys terminated by ':' #元素内部的分隔符lines terminated BY '\n'#指定换行符为行分隔符stored AS textfile #指定最终表数据的存储格式,默认是textfile,还可以是rcfile(行列结合的格式)/parquet(压缩格式)location '/user/student' #指定hive上表在hdfs上的存储路径,默认的是配置路径下
1.内部表
CREATE TABLE if not exists student(id int ,sname string ,age int)
ROW FORMAT delimited FIELDS terminated BY ','
LINES terminated BY '\n';
2.外部表
CREATE external TABLE if not exists student(id int ,sname string ,age int)
ROW FORMAT delimited FIELDS terminated BY ','
LINES terminated BY '\n'
location '/user/student';
注意:
建外部表之后,若是从HDFS上加载数据的话(本质上是移动数据),会将数据从原路径移动到建表的路径下,
若两者路径不一致,则会导致其他部门的代码无法获取到数据,
因此,建立外部表的时候一定要location路径,且该路径与数据的原路径保持一致,
否则,会造成工作的重大失误!!!
3.分区表
CREATE TABLE if not exists student(id int ,sname string ,age int)
PARTITION BY (city string )
ROW FORMAT delimited FIELDS terminated BY ','
LINES terminated BY '\n';
4.分桶表
CREATE TABLE if not exists student(id int ,sname string ,age int)
clustered BY (id,age)
sorted BY (id ASC, age DESC)
INTO 9 buckets
ROW FORMAT delimited FIELDS terminated BY ','
LINES terminated BY '\n';
5.复制表
CREATE TABLE if not exists student01 LIKE student;
- 复制一个表结构和student一样的表,不复制数据
- 复制表student01是内部表还是外部表与student没关系,只与创建过程中是否指定了关键字external
6.查询表
CREATE TABLE if not exists student01 AS select id,sname FROM student;
查询出student表中的字段存入新建的表中,就叫查询表
数据类型详解
简单类型:
- string
- float
- int (4个字节的整数)
- bigint (8个字节的整数)
- smallint (2个字节的整数)
- tinyint (1个字节的整数)
复杂类型:
1)array:数组,存储多个元素,且元素是相同的数据类型,比如:beijing,shenzhen,wuhan
CREATE TABLE if not exists student(id int ,city array<string>)
ROW FORMAT delimited fields terminated BY '\t'
collection items terminated by ',';
查找时通过下标定位
SELECT city[0] FROM student; #输出:beijingSELECT city FROM student; #输出:[beijing,shenzhen,wuhan]
2)map:映射,比如:Chinese:80,math:90
CREATE TABLE if not exists student(id int ,score map<string,int>)
ROW FORMAT delimited fields terminated BY '\t'
collection items terminated by ','
map keys terminated by ':';
查找时通过key定位
SELECT score FROM student;
#输出:{Chinese:80,math:90} SELECT score['math'] FROM student; #输出:90
3)struct:结构体,存储多个元素,元素类型可以不同,比如:mengfan,man,180
CREATE TABLE if not exists student(id int ,remarks struct<name:string,sex:string,height:int>)
ROW FORMAT delimited fields terminated BY '\t'
collection items terminated by ','
查找时通过.查找具体的信息
SELECT remarks FROM student; #输出:{name:mengfan,sex:man,height:180}SELECT remarks.height FROM student; #输出:180
分隔符详解
1)列分隔符、元素分隔符、元素内分隔符、行分隔符的顺序
ROW FORMAT delimited fields terminated BY '\t' #指定空格为列分隔符
collection items terminated by ',' #集合中的元素间的分隔符
map keys terminated by ':' #元素内部的分隔符
lines terminated BY '\n'#指定换行符为行分隔符
比如:有一行数据: 0001 黄海霞,孟凡 语文:80,数学:90
空格是两列数据的分隔符,逗号是两个元素之间的分隔符,冒号是元素内部的分隔符
三种分隔符的顺序为:由外到内,顺序不可改变,行分隔符在最后;
2)多字节的分隔符
hive默认只能解析单字节分隔符,数据:0001::黄海霞::80
方法1:修改serde library,默认是lazysimpleserde,改为RegexSerDe
create table stu (id int,sname string,score string)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' #指定序列化类库,正则表达式
with serdeproperties('input.regex'='(.*)::(.*)::(.*)' #定义输入的正则表达式 ,'output.format.string'='%1$s %2$S %3$S'); #定义输出的结果
注意:
- 数据中有多少个分隔符,表达式中就要有多少个(.*)::(.*)::(.*)
- 分隔符若是|,则需要用\\转义,(.*)\\|\\|(.*)\\|\\|(.*)
- 输出结果中的 %1$s 个数要与输入中的(.*)的个数对应
- (.*)代表的是任意字符
- $s 是占位符
方法2:修改hive底层源码,影响较大,其他使用单字节的文件容易出错,不推荐使用
查看表
SHOW tables#查看数据表 SHOW tables in hd_hive; #查看hd_hive库中的数据表 SHOW tables LIKE 's*'; #查看表名是以s开头的表 SHOW create table student; #查看student表的建表语句 SHOW PARTITIONS student; #查看student表的分区 SHOW PARTITIONS student PARTITION(city='beijing'); #查看student表的beijing分区DESC student; #查看表的字段信息 DESC formatted student; #查看元数据库中,表的字段信息(已格式化) DESC extended student; #查看元数据库中,表的详细信息(未格式化)
删除表
DROP TABLE IF EXISTS student; #删除表,包括表结构和表数据 TRUNCATE TABLE IF EXISTS student; #清空表,保留表结构,删除表数据
- 内部表:删除的时候,元数据库会删除,且HDFS上的原始数据也会被删除;
- 外部表:删除的时候,元数据库会删除,但HDFS上的原始数据不会被删除;
修改表
1.修改表名
ALTER TABLE student RENAME TO stu; #修改表名,student改为stu
2.修改表字段信息
ALTER TABLE student ADD COLUMNS(department string); #添加字段 ALTER TABLE student REPLACE COLUMNS(id int ,sname string); #替换表的所有列的字段 ALTER TABLE student CHANGE sname tname string; #修改字段名称,需同时指定新字段的类型ALTER TABLE student CHANGE age age string; #修改字段类型(有限制)int能转化成string,只能小转大,不可逆;但是hive1.2.2版本中没有这个限制
3.修改表分区信息
ALTER TABLE student ADD if not exists PARTITION (city='shanghai'); #添加分区 ALTER TABLE student ADD if not exists PARTITION (city='shenzhen') location '/user/student/shenzhen';#添加分区的同时指定路径 ALTER TABLE student DROP if exists PARTITION (city='beijing'); #删除分区
修改分区:
ALTER TABLE student PARTITION (city='shenzhen') SET location '/user/shenzhen'; #修改分区的路径 ALTER TABLE student PARTITION (city='shenzhen') ENABLE no_drop; #防止分区被删除 ALTER TABLE student PARTITION (city='shenzhen') ENABLE offline; #防止分区被查询
其他辅助命令
SHOW CREATE TABLE student; # 查看建表语句,将默认语句自动补全后的建表语句
Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)相关推荐
- hive详细笔记(四)-Hive内部表,外部表,分区表,分桶表详解(附带讲解视频)
本节目录 内部表和外部表 静态分区表 动态分区表 分桶表 抽样查询 1 内部表和外部表 未被external修饰的是内部表(managed table),被external修饰的为外部表(extern ...
- Hive 分区表 分桶表
本文目录 1.分区表 Ⅰ.分区表基本操作 1.创建分区表语句 2.分区数据准备 3.装载数据至指定分区 4.数据查询 Ⅰ.全表数据查询 Ⅱ.单个分区数据查询 Ⅲ.多个分区数据查询 5.增加分区 6.删 ...
- MySQL 表的增删改查(进阶篇①)· 数据库约束 · 表的设计 · 新增查询结果 · 聚合查询 · 聚合函数 · group by · having · 笛卡尔积
一.数据库约束 1.1 约束类型 1.2 非空约束 not null 1.3 唯一约束 unique 1.4 默认约束 default 1.5 主键约束 primary key 1.6 自增主键 pr ...
- Hadoop之Hive数据库和表的增删改查(DDL)
Hive QL 是Hive支持的类似SQL的查询语言.Hive QL大体可以分为DDL.DML和UDF语言.DDL语言主要是创建数据库.创建表.数据库和表的删除:DML主要进行数据的添加.查询:UDF ...
- 六、Hive中的内部表、外部表、分区表和分桶表
文章目录 内部表 外部表 分区表 分桶表 在Hive数据仓库中,重要点就是Hive中的四个表.Hive 中的表分为内部表.外部表.分区表和分桶表. 内部表 默认创建的表都是所谓的内部表,有时也被称为管 ...
- MySQL表的增删改查(基础)
MySQL表的增删改查(基础) 文章目录 MySQL表的增删改查(基础) 新增(`Create`) 查询(`Retrieve`) 更新(`Update`) 删除(`Delete`) 总结 注释:在SQ ...
- 大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别
蛋蛋 和 小智 今天又在"打情骂俏",他们今天在谈论分区表和分桶表,走,我们去听听. 这天,蛋蛋去茶水间倒水,他把水杯放在饮水机下面,打开开关,一直盯着墙上的画在看,灵魂仿佛已经飞 ...
- Hive Sampling 抽样函数:Random随机抽样、Block 基于数据块抽样、Bucket table 基于分桶表抽样
Hive Sampling 抽样函数 文章目录 Hive Sampling 抽样函数 Random随机抽样 Block 基于数据块抽样 Bucket table 基于分桶表抽样 语法 在HQL中,可以 ...
- Hive 的概念、应用场景、安装部署及使用、数据存储 、table(内部表)和external table(外部表)、partition(分区表)和bucket(分桶表)
目录 1.Hive 的概念 2.Hive 的特点 3.Hive 和 RDBMS(关系型数据库) 的对比 4.Hive 和 HBase 的差别 5.Hive 架构 6.Hive安装与使用方法介绍 7.H ...
最新文章
- Maven学习笔记(二) :Maven的安装与配置
- 设计模式 之 建造者
- DNS_ARP_DHCP协议
- easypoi 如何合并相同的列,如何在Java中的POI中使用XWPFTable合并单元格(或应用colspan)?...
- 【测试点2分析】:1020 月饼 (25分)(甲级 1070 Mooncake (25 分))
- FTPClient登录慢的问题
- django 不包括字段 序列化器_手写一个Django序列化功能
- Debian Linux 的 vim 如何使用系统剪贴板
- python调用cplex求解装箱问题_使用cplex(python)解决限制背包(01背包)问题
- python3里面的图片处理库 pillow
- TensorFlow 是一个用于人工智能的开源神器
- poj_3468 线段树
- 死亡之ping(Ping of Death)
- 安装office2007 1706错误
- 在GIS中UTM和WGS84的区别
- html制作打飞机的游戏,JavaScript 小型打飞机游戏实现原理说明
- win10打开 Windows凭据管理器 0x800706BA
- 使用ArrayList集合实现学生管理系统
- 学计算机文科好还是理科好,大学毕业之后才明白,文科生和理科生的差距有多大?高中生注意...
- apache poi 生成word 3D折线图 maven
热门文章
- CentOS 7 gedit编辑器中文乱码解决方法
- WCF分布式开发步步为赢系列
- %求余数 rand随机数
- skiplist原理与实现
- 嵌入式里如何给内存做压力测试?不妨试试memtester
- Linux cpuidle framework
- java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...
- docker 定时重启脚本_使用 Go 添加启动脚本
- QT——QT4.8.5安装与配置
- OCR系列——总体概述