Hive之内部表外部表和分区表分桶表

news2025/7/14 7:41:23

Hive系列


第七章 内部表外部表和分区表分桶表

7.1 内部表和外部表

7.1.1 内部表和外部表的区别

1、创建的时候外部表加上external
2、删除表的时候,内部表会删除元数据信息和真实数据信息,外部表只会删除描述信息

7.1.2 内部表和外部表的应用场景

1、如果数据已经存储在hdfs上,然后使用hive去进行分析,并且还有可能有其他的计算引擎使用到这份数据,那么请你创建外部表。
2、如果一份数据仅仅是hive使用来进行分析,可以创建内部表。

推荐:
1、创建内部表的时候,建议大家用默认的路径
2、创建外部表的时候,指定location的路径。

经验

7.2 分区表

7.2.1 理论

​ 分区表对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive 中的分区就是分数据目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过 WHERE 子句中的表达式可以选择查询所需的分区,这样的查询效率会提高很多。

7.2.2 实践

// 创建只有一个分区字段的分区表:
create table student_ptn(id int, name string, sex string, age int, department string) partitioned by (city string comment "partitioned field") row format delimited fields terminated by ",";
	表类型 : Table Type:         	MANAGED_TABLE
	
load data local inpath "/home/data/student.txt" into table student_ptn;  XXXXXXX
hive> load data local inpath "/home/data/student.txt" into table student_ptn;
FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned
老的版本报上面的错。
但是3.1.2的版本,不支持使用local,走hdfs上面的对应的路径下面去复制对应的数据到hive的默认的city=__HIVE_DEFAULT_PARTITION__ 分区文件夹下面。 

// 把数据导入到一个不存在的分区,它会自动创建该分区
load data local inpath "/home/data/student.txt" into table student_ptn partition(city="beijing");  √√√√

// 把数据导入到一个已经存在的分区
alter table student_ptn add partition (city="chongqing");
load data local inpath "/home/data/student.txt" into table student_ptn partition(city="chongqing");

// 创建有多个分区字段的分区表:
create table student_ptn_date(id int, name string, sex string, age int, department string) partitioned by (city string comment "partitioned field", dt string) row format delimited fields terminated by ",";

// 往分区中导入数据:
load data local inpath "/home/data/student.txt" into table student_ptn_date partition(city="beijing");  //报错

load data local inpath "/home/data/student.txt" into table student_ptn_date partition(city="beijing", dt='2012-12-12');    //正确
	
	问题是:city分区和dt分区是并列关系还是父子级别关系?
			平级并列关系  0
			父子目录关系  1
		
// 不能在导入数据的时候指定多个分区定义
load data local inpath "/home/data/student.txt" into table student_ptn_date partition(city="beijing", dt='2012-12-14') partition (city="beijing" , dt='2012-12-13');   XXXXXX

// 添加分区
alter table student_ptn_date add partition(city="beijing", dt='2012-12-14') partition (city="beijing" , dt='2012-12-13');    √√√√√√√√
alter table student_ptn_date add partition(city="chongqing", dt='2012-12-14') partition (city="chongqing" , dt='2012-12-13');  √√√√√√√√

// 查询一个分区表有那些分区
show partitions student_ptn;
show partitions student_ptn_date;
show partitions student; //不是分区表的话,查询的时候会给你报错。

7.3 分桶表

7.3.1 理论

1、分区提供一个隔离数据和优化查询的便利方式。但并非所有的数据集都可形成合理的分区。
2、对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。
3、分桶是将数据分解成更容易管理的若干部分的另一个技术。
4、分区针对的是数据的存储路径,分桶针对的是数据文件。

7.3.2 实践

7.3.2.1 load方式导入

1、创建一个bucket文件,并在里面对应的数据
vim bucket.txt

0001	liuyi
0002	chener
0003	zhangsan
0004	lisi
0005	wangwu
0006	zhaoliu
0007	sunqi
0008	zhouba
0009	wujiu
0010	zhengshi
0011	zhangsan2
0012	lisi2

2、创建分桶表
create table stu_bucket(id int, name string)
clustered by(id)
into 3 buckets
row format delimited fields terminated by '\t';

3、看看表结构
hive (mydb)> desc formatted stu_bucket;


4、load方式导入数据
load data local inpath '/home/data/bucket.txt' into table stu_bucket;
注意,不可以从linux本地导入,导入的时候报错说找不到路径,实际上本地是有的。
需要先给上传到hdfs上面,然后从hdfs上面导入,也就是使用下面的语句。不加local
load data inpath '/home/data/bucket.txt' into table stu_bucket;

5、查看分桶的结果
hive (mydb)> select * from stu_bucket;
OK
stu_bucket.id	stu_bucket.name
12	lisi2
9	wujiu
6	zhaoliu
3	zhangsan
10	zhengshi
7	sunqi
4	lisi
1	liuyi
11	zhangsan2
8	zhouba
5	wangwu
2	chener
Time taken: 0.1 seconds, Fetched: 12 row(s)
注意分桶规则:
Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定对应记录存放在哪个桶当中。


6、去HDFS上面查看一下结果如下:

在这里插入图片描述

7.3.2.2 insert 方式将数据导入分桶表

1、先创建分桶表
create table stu_bucket2(id int, name string)
clustered by(id)
into 3 buckets
row format delimited fields terminated by '\t';

2、创建一个中间测试表student_test
create table student_test(id int, name string)
row format delimited fields terminated by '\t';

3、往中间测试表里面放数据
load data local inpath '/home/data/bucket.txt' into table student_test;

4、insert 方式将数据导入分桶表
insert into table stu_bucket2 select * from student_test;

5、查看结果
hive (mydb)> select * from stu_bucket2;
OK
stu_bucket2.id	stu_bucket2.name
12	lisi2
9	wujiu
6	zhaoliu
3	zhangsan
10	zhengshi
7	sunqi
4	lisi
1	liuyi
11	zhangsan2
8	zhouba
5	wangwu
2	chener
Time taken: 0.12 seconds, Fetched: 12 row(s)



声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA高级】——Druid连接池和Apache的DBUtils使用

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

HBase查询一张表的数据条数的方法

HBase查询一张表的数据条数的方法 文章目录HBase查询一张表的数据条数的方法0、写在前面1、HBase-Shell的count命令2、Scan操作获取数据条数3、执行Mapreduce任务4、Hive与HBase整合5、协处理器Coprocessor实现6、参考资料0、写在前面 Linux版本:Ubuntu Kylin 16.0…

国网云(华为组件)使用

一、国网云(华为组件)介绍 一、项目各项环境 各项环境的介绍 MRS-Hive:MRS支持在大数据存储量大,计算资源需要弹性扩展的场景下,用户将数据存储在OBS服务中。使用MRS集群仅做数据计算处理的存算分离模式。DWS(高斯200):云原生数据库Gauss DB(DWS)1:融合分析能力是云原…

分布式计算模型Mapreduce实践与原理剖析(二)

第二章 MapReduce核心组件实战 2.1 MapReduce中分区组件 需求:根据单词的长度给单词出现的次数的结果存储到不同文件中,以便于在快速查询 思路: 1、定义Mapper逻辑 2、定义Reducer逻辑 3、自定义分区Partitioner这个案例主要的逻辑在这个…

【kafka】一、kafka介绍

kafka概述 定义 kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。 消息队列 1)解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 2)可恢复性 系统的一部分组件…

java EE初阶 —进程与线程的区别

文章目录1.为什么会引入进程和线程的概念2.进程和线程的关系2.1 坤坤吃鸡演示进程和线程区别2.1.1 线程的安全问题2.1.2 线程的异常问题1.为什么会引入进程和线程的概念 引入进程这个概念,最主要的目的是为了解决并发编程这样的问题。 CPU 已经进入了多核心的时代&…

【Keil】编译选项设置 Warning 为 error

死亡是一座永恒的灯塔,不管你驶向何方,最终都会朝它转。一切都将逝去,只有死神永生。 – 刘慈欣-《三体》 前言 众所周知,一般而言,编译程序过程中的 warning 警告并不会影响可执行文件的生成,只有 error …

JVM 垃圾回收器分类

目录 Serial收集器 Parnew收集器 Parallel Scavenge CMS收集器 G1收集器 Serial收集器 基本概念:Serial收集器是最基本、发展历史最久的收集器,这个收集器是采用复制算法的单线程的收集器。 重点:其采用复制算法和单线程。 单线程的收集…

01_SpringBoot简介及项目搭建

文章目录SpringBoot简介及项目搭建0x01_SpringBoot简介Spring优缺点springboot启动器0x02_Spring boot项目搭建方式1启动类和启动器的区别0x03_Spring boot项目搭建方式20x04_Spring boot项目搭建方式3(最推荐)SpringBoot简介及项目搭建 欢迎关注公众号…

MYSQL 数据库企业级架构演变史

从初级架构到中级架构原来有这么多次的升级,并且每一次的进阶都有其优缺点,文末还有对高级结构的理解,欢迎大家在评论区各抒己见~ MySQL简介 MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB公 司开发,…

【强化学习论文合集】AAAI-2021 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现…

九、【React基础】组件的生命周期

文章目录1、旧生命周期1.1、单组件生命周期1.1.1、生命周期1.1.1.1、初始化阶段:由 ReactDOM.render() 触发---初次渲染1.1.1.2、更新阶段:由组件内部 this.setSate() 或父组件重新render触发1.1.1.3、卸载组件:由 ReactDOM.unmountComponent…

流媒体传输 - RTP 荷载 H264

H264 码流结构 H264 码流是由很多 NAL Unit 组成,所有 NAL Unit 均存在一个八位数据的 NAL Unit Header ,这八位数据也充当此 RTP 有效负载格式的有效负载头。一个 NAL Unit Header 的语法如下: ---------------|0|1|2|3|4|5|6|7|--------|F|NRI| Type…

深分页Scroll

ES对from size是有限制的,from和size二者之和不能超过1W 原理: fromsize在ES查询数据的方式: 第一步现将用户指定的关键进行分词。 第二步将词汇去分词库中进行检索,得到多个文档的id。 第三步去各个分片中去拉取指定的数据。耗…

JUC总结-基础篇

juc是什么? JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题! juc脑图 juc总结 juc多数工具都是依赖volatile关键字保持可见性和禁止指…

ovs vxlan 时延和吞吐

设计云时到底要不要用vxlan,如果用vxlan到底要不要购买比较贵的smart nic做offload,采用软件vxlan还是硬件交换机vxlan,很难决策,这儿简单测试一下,给个参考,资源终究是有限的,成本还是有考虑的…

Flutter splash 屏幕

Flutter splash 屏幕 原文 https://medium.com/bedirhanssaglam/flutter-splash-screen-a8cafec52c8e 前言 启动画面通常被特别大的应用程序用来通知用户程序正在加载过程中。它们提供的反馈表明,一个漫长的过程正在进行中。有时,启动画面中的进度条会指…

【MYSQL】在线恢复主从复制方案

一、恢复前提 因复杂情况,从库无法从binlog中恢复主从复制关系,需要从备份文件中恢复。恢复过程的几个关键点为: 1、从库现有数据的清理。本方案采用覆盖的方式,导出时添加add-drop参数即可。还有一个方案是手动删除数据文件&…

1990-2021年全国各省外商直接投资水平

1990-2021年全国各省外商直接投资水平 1、包括全国30省,不含西藏 2、指标包括: 行政区划代码、长江经济带、年份、地区、经度、纬度、GDP(亿元)、外商直接投资(美元)(万美元)、人民币对美元汇率(美元1)(元)、外商直接投资(万元)、外商直接投资水平 3、…

第三章:CompletableFuture

Future接口复习FutureTask 实现类Future 编码的优缺点优点缺点get() 方法导致阻塞isDone() 轮询总结CompletableFutureCompletableFuture 为什么会出现?CompletableFuture 架构图CompletionStageCompletableFuture 四个静态方法CompletableFuture 减少阻塞和轮询注意…