Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >hive的数据存储(元数据,表数据)和内部表,外部表,分区表的创建和区别作用

hive的数据存储(元数据,表数据)和内部表,外部表,分区表的创建和区别作用

作者头像
全栈程序员站长
发布于 2022-08-09 07:05:55
发布于 2022-08-09 07:05:55
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

hive数据存储:

首先弄清楚什么是元数据和表数据:元数据就是表的属性数据,表的名字,列信息,分区等标的属性信息,它是存放在RMDBS传统数据库中的(如,mysql)。表数据就是表中成千上万条数据了。

hive的存储过程:启动hive时,会初始化hive,这时会在mysql中生成大约36张表(后续随着业务的复杂会增加),然后创建表,会在mysql中存放这个表的信息(不是以表的形式存在的,而是把表的属性以数据的形式放在mysql中,这样在hive中使用sql命令一样是能够查到这张表的)。然后把本地的文本文件使用hive命令格式化导入到表中,这样这些数据就存放到hdfs中,而不是在mysql或hive中。

内部表,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 hive> create table student(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";

我创建了一个studetn表,在mysql中是看不到这个表的:

而是使用命令,查找上面的tbls这个表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select * from hive.TBLS;

然后在导入数据(hive不能进行增删改,也就是不能使用insert into ,update,delete等命令;想一想我们做大数据统计是分析数据的,而不是修改数据,再者数据是以文本的形式放在hdfs中的,因此不能修改数据):我这里上传本地txt文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hive> load data local inpath "/home/xiaoye/students.txt" into table student;
Copying data from file:/home/xiaoye/students.txt
Copying file: file:/home/xiaoye/students.txt
Loading data to table hive2.student
Table hive2.student stats: [numFiles=1, numRows=0, totalSize=56, rawDataSize=0]
OK
Time taken: 6.346 seconds
hive> select * from student;
OK
1       小明    man     12      NULL
2       小红    woman   14      NULL
3       xiaoliang       man     13      NULL
Time taken: 0.964 seconds, Fetched: 3 row(s)
hive> desc student;
OK
id                      int                                         
name                    string                                      
sex                     string                                      
age                     int                                         
department              string                                

再到hdfs页面上有没有生成对应的数据:

说明没问题。

———————————————————————————————————

外部表案例(这里就使用网友大神的博文,更美观):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0: jdbc:hive2://hadoop3:10000> create external table student_ext
(id int, name string, sex string, age int,department string) row format delimited fields terminated by "," location "/hive/student";
No rows affected (0.248 seconds)

——————————————————————————————————————————–

内部表外部表区别:

首先二者不是共存关系也不是修改关系,而是一开始创建表的使用要想好你到底需要什么样的表。

然后, 1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;

2、在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

3. 在创建内部表或外部表时加上location 的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。

外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如果所有处理都需要由Hive完成,那么你应该创建表,否则使用外部表!

—————————————————————————————————–

分区表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0: jdbc:hive2://hadoop3:10000> create external table student_ptn(id int, name string, sex string, age int,department string)
. . . . . . . . . . . . . . .> partitioned by (city string)
. . . . . . . . . . . . . . .> row format delimited fields terminated by ","
. . . . . . . . . . . . . . .> location "/hive/student_ptn";
No rows affected (0.24 seconds)

添加分区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0: jdbc:hive2://hadoop3:10000> alter table student_ptn add partition(city="beijing");
No rows affected (0.269 seconds)
0: jdbc:hive2://hadoop3:10000> alter table student_ptn add partition(city="shenzhen");
No rows affected (0.236 seconds)
0: jdbc:hive2://hadoop3:10000> 

为什么要使用分区表呢?

看上面的例子很显然,这是个学生表,然后以城市分区,这样就能够根据学生所在市不同把不同的分区分在表中不同的子文件夹中.这样数据也就在不同的磁盘文件中,数据库对不同的分区会进行单独的管理,优化,最终的目的是加快我们数据查询的速度。

代码语言:javascript
代码运行次数:0
运行
复制

--------------------------------------------------------------------------------------------------------------------------------

最后还有个桶,这个有点难理解,就不做多说了就放个案例吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0: jdbc:hive2://hadoop3:10000> create external table student_bck(id int, name string, sex string, age int,department string)
. . . . . . . . . . . . . . .> clustered by (id) sorted by (id asc, name desc) into 4 buckets
. . . . . . . . . . . . . . .> row format delimited fields terminated by ","
. . . . . . . . . . . . . . .> location "/hive/student_bck";

———————————————

增加 桶:

桶表(bucket table):

  原理:

    分区表是按照经常查询的字段做不同的分区,查询时就可以按分区进行查了.这样可以减小全局扫描提高查询的速度.分区表的缺陷就是选定了分区字段之后,结果会造成数据偏差特别大,有的分区数据特别大,有的分区数据特别小,这个时候作业的整个查询时间就受制于分区中数据特别大的那个分区,对整个作业的运行效率是不好的.     桶表和分区表的区别在于:不是按照业务字段来进行分区,对里面的记录做一个hash,记录做完hash之后就没有规律了,可以简单的认为数据做完hash之后都不相同,然后我们让数据进行模10,数据就被分成了十份,模100就被分成100份,因为hash值几乎各不相同,所以模后的结果,分成10份或者100份,每一份的数据量几乎是一样多的,当你hash之后然后模一个数字,分的那些数据量,每一份应该是差不多的,如果这样的话,我们把这样的数据存起来,模5,10,100 模的这个数字叫做桶,模几就分成几个桶,桶实际上就是模的数字,我们的记录就被划分到这个桶里面了,那么hive在进行查询的时候就会按照5个桶或者10个桶来进行处理,这样的话,好处是各个map运行的时间差不多.   桶表用的领域很少,一般用在表连接中,有两个表,有一个外键是连接字段,我们的这一个表里面的字段和另外一个的连接字段的值是相同的,hash后的值应该也相同,分桶的话会分到相同的桶中,在进行表连接的时候就比较方便了,只需要把对应的桶的数据连接一下然后再从里边查数据就方便了.

  还有一个优点就是在进行抽样查询的时候,我们的记录只有10亿条记录,要查一下北京的有多少个,没必要把十亿条记录全扫一遍,但是可以扫一万或者一百万看一下北京的有多少,然后就可以大体的判断一下北京的大约占多少百分比了.抽样不需要一个准确的值,只需要一个样本就可以了,这样样本只要符合统计学上的大小就可以了,那么我们在进行抽样的话,如果按照桶表来进行抽样更合理,如果按时间抽,统计结果就不准了.

  创建桶表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    create table bucket_table(id int,name string) clustered by(id) into 3 buckets;

  加载数据:

    需要计算id的hash值,分桶.所以不能使用load data,load data加载方式是直接把数据从我们的磁盘复制到hdfs目录下,但是我们的分桶需要计算,计算需要走mapreduce,所以需要通过这种方式走mapreduce

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    设置启用桶 set hive.enforce.bucketing=true;
  insert overwrite table bucket_table select id,name from jiuye;

  分桶之后是三个文件,分区表是文件夹.桶表和分区表目的都是为了把数据进行划分,只是划分的方式不一样,一个是从业务字段的角度来划分,一个是抛弃了业务字段从纯数据的角度来进行划分,纯数据的角度和查询就不搭界了,主要就是用于抽样,表连接.

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106075.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别
蛋蛋 和 小智 今天又在“打情骂俏”,他们今天在谈论分区表和分桶表,走,我们去听听。
kk大数据
2020/11/03
5.3K0
大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别
如何使用Sentry管理Hive外部表权限
使用如下命令在HDFS的根目录下创建Hive外部表的数据目录/extwarehouse
Fayson
2018/03/29
5.4K0
如何使用Sentry管理Hive外部表权限
hive学习笔记之三:内部表和外部表
至此,咱们对内部表和外部表已经有了基本了解,接下来的文章学习另一种常见的表类:分区表;
程序员欣宸
2021/06/29
9720
hive学习笔记之三:内部表和外部表
Hive 内部表和外部表
这里创建了表page_view,有表的注释,一个字段ip的注释,分区有两列,分别是dt和country。ROW FORMAT DELIMITED关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符。不同列之间用一个\001分割,
大数据工程师-公子
2019/03/13
9850
Hive 内部表和外部表
Hive应用:外部分区表 原
Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示。
云飞扬
2019/03/13
9320
Hive应用:外部分区表
                                                                            原
Hive-1.2.1_03_DDL操作 1.1. Create Database1.2. Drop Database1.3. Use Database2.1. Cre
  注意:各个语句的版本时间,有的是在 hive-1.2.1 之后才有的,这些语句我们在hive-1.2.1中是不能使用的。
踏歌行
2020/10/15
7620
Hive-1.2.1_03_DDL操作
    




        1.1. Create Database1.2. Drop Database1.3. Use Database2.1. Cre
【赵渝强老师】Hive的内部表与外部表
Hive是基于HDFS之上的数据仓库,它把所有的数据存储在HDFS中,Hive并没有专门的数据存储格式。当在Hive中创建了表,可以使用load语句将本地或者HDFS上的数据加载到表中,从而使用SQL语句进行分析和处理。
赵渝强老师
2024/10/25
2040
【赵渝强老师】Hive的内部表与外部表
hive学习笔记之四:分区表
本文是《hive学习笔记》系列的第四篇,要学习的是hive的分区表,简单来说hive的分区就是创建层级目录的一种方式,处于同一分区的记录其实就是数据在同一个子目录下,分区一共有两种:静态和动态,接下来逐一尝试;
程序员欣宸
2021/07/01
3480
hive学习笔记之四:分区表
hive基本概念
用户1171305
2017/12/28
9050
Hive常用函数的使用
文章作者:foochane </br> 原文链接:https://foochane.cn/article/2019062501.html
foochane
2019/07/01
1.3K0
hive数据定义语言DDL
显示hive中数据库的名称,注释(如果已经设置),及其在文件系统中的位置等信息
h3110_w0r1d
2024/02/19
1910
hive数据定义语言DDL
Hive的数据类型
本文介绍hive的数据类型,数据模型以及文件存储格式。这些知识大家可以类比关系数据库的相关知识。
加米谷大数据
2018/07/25
2.3K0
Hive的数据类型
数据分析工具篇——HQL中DDL操作
1.1) CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
数据森麟
2021/03/09
6330
数据分析工具篇——HQL中DDL操作
(超长文)Hive Sql基本操作
2.注释问题2.1 MySQL中的注释2.2 Hive中的注释3.乱码问题3.1 修改表字段注解和表注解3.2 修改分区字段注解3.3 修改索引注解3.4 修改metastore的连接URL4.数据库基本操作4.1 创建带属性的库4.2 显示数据库详情:4.3 查看正在使用哪个库4.4 查看数据库的详情语句5.删除数据库5.1 删除库原则5.2 删除不含表的数据库5.3 删除含表数据库6.切换库及创建表6.1 切换库6.2 创建表7.表详情及表操作7.1 表详情7.2 表操作8.分区8.1 查看分区8.2 添加分区8.3 修改分区8.4 删除分区
公众号guangcity
2019/09/20
3.7K0
(超长文)Hive Sql基本操作
数据仓库之Hive快速入门 - 离线&实时数仓架构
了解了Hive中的SQL基本操作之后,我们来看看Hive是如何将SQL转换为MapReduce任务的,整个转换过程分为六个阶段:
端碗吹水
2020/11/11
4.7K0
【Hive】Hive 的基本认识
Hive 是由 Facebook 开源的基于 Hadoop 的数据仓库工具,用于解决海量「结构化日志」的数据统计。
阿泽 Crz
2020/07/21
1.5K0
【Hive】Hive 的基本认识
六、Hive中的内部表、外部表、分区表和分桶表
在Hive数据仓库中,重要点就是Hive中的四个表。Hive 中的表分为内部表、外部表、分区表和分桶表。
润森
2022/08/18
2K0
六、Hive中的内部表、外部表、分区表和分桶表
如何使用Sentry管理Hive外部表(补充)
/extwarehouse/student_hive数据目录不存,在创建外部表时自动生成,且数据目录属主为hive。
Fayson
2018/03/29
1.3K0
如何使用Sentry管理Hive外部表(补充)
hive中外部表、内部表、分区表、分桶表
create table student(t_id string,t_name string) row format delimited fields terminated by ‘\t’; 加载数据 ( /export/servers/hivedatas/student .csv 数据在虚拟机上地址) load data local inpath ‘/export/servers/hivedatas/student .csv’ into table student; 在hdfs查看表中的数据 ( /user/hive/warehouse/myhive.db/student 数据在hdfs上的地址) hadoop fs -ls /user/hive/warehouse/myhive.db/student 在hive中查询 select * from student 删除数据表techer drop table student; 再次查看 hadoop fs -ls /user/hive/warehouse/myhive.db/student(数据不存在)
用户4870038
2021/02/05
6790
Hive 中内部表与外部表的区别与创建方法
先来说下Hive中内部表与外部表的区别: Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。 需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否 符合schema的,hive 遵循的是 s
用户1177713
2018/02/24
2.6K0
相关推荐
大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验