Hive学习---5、分区表和分桶表

news2024/11/27 4:22:25

1、分区表和分桶表

1.1 分区表

Hive中的分区就是把一张大表的数据按照业务需求分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。

1.1.1 分区表基本语法

1、创建分区表

create table dept_partition
(
    deptno int,    --部门编号
    dname  string, --部门名称
    loc    string  --部门位置
)
    partitioned by (day string)
    row format delimited fields terminated by '\t';

2、分区表读写数据
(1)写数据

  • load

    • 数据准备
      在/opt/module/hive/datas/路径上创建文件dept_20220401.log,并输入如下内容
    10	行政部	1700
    20	财务部	1800
    
    • 装载数据

      load data local inpath '/opt/module/hive/datas/dept_20220401.log' 
      into table dept_partition 
      partition(day='20220401');
      

(2)insert
将day='20220401’分区的数据插入到day='20220402’分区,可执行如下装载语句

insert overwrite table dept_partition partition(day='20220402')
select deptno, dname, loc
from dept_partition
where day='2020-04-01'

2、读数据
查询分区表数据时,可以将分区字段看作表的伪列,可像其他字段一样使用分区字段。

select deptno, dname, loc ,day
from dept_partition
where day = '2020-04-01';

3、分区表基本操作
(1)查看所有分区信息

select partitions dept_partition;

(2)增加分区

  • 创建单个分区
alter table dept_partition
add partition(day='20220403');
  • 同时创建多个分区(分区之间不能有逗号)
alter table dept_partition 
add partition(day='20220404') partition(day='20220405');

(3)删除分区

  • 删除单个分区
alter table dept_partition 
drop partition(day=''20220403);
  • 同时删除多个分区(分区之间必须有逗号)
alter table dept_partition
drop partition(day='20220404'),partition(day='20220405');

4、修复分区
Hive将分区表的所以分区信息都保存在了元数据中,只有元数据与HDFS上的分区路径一致时,分区表才能正常读写数据。若手动创建/删除分区路径,Hive都是感知不到的。这样会导致Hive的元数据和HDFS的分区路径不一致。再比如,若分区表位外部表,用户执行drop Partition 命令后,分区元数据会被删除,而HDFS的分区路径不会被删除,同样会导致Hive的元数据和HDFS的分区路径不一致。
若出现元数据和HDFS路径不一致的情况,可通过如下几种手段恢复。
(1)add partition
若手动创建HDFS的分区路径,Hive无法识别,可通过add partition命令增加分区元数据信息,从而使元数据和分区路径保持一致。
(2)drop partition
若手动删除HDFS的分区路径,Hive无法识别,可通过drop partition命令删除分区元数据信息,从而使元数据和分区路径保持一致。
(3)msck
若分区元数据和HDFS的分区路径不一致去,还可以使用msck命令进行修复,以下是该命令的用法说明。

msck repair table table_name [add/drop/sync partitions];

说明:
msck repair table table_name add partitions :该命令会增加HDFS路径存在但元数据缺失的分区信息。
msck repair table table_name drop partitions:该命令会删除HDFS路径已经删除,但是元数据仍然存在的分区信息。
msck repair table table_name sync partition :该命令会同步HDFS路径和元数据分区信息,相当于同时执行上述的两个命令。
msck repair table table_name :等价于 msck repair table table_name add partitions 命令。

1.1.2 二级分区表

思考:如果一天内的日志数据量也很大,如何再将数据拆分?答案是二级分区表,例如可以在按天分区的基础上,再对每天的数据按小时进行分区。
1、二级分区建表语句

create table dept_partition2(
    deptno int,    -- 部门编号
    dname string, -- 部门名称
    loc string     -- 部门位置
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';

2、数据装载语句

load data local inpath '/opt/module/hive/datas/dept_20220401.log' 
into table dept_partition2 
partition(day='20220401', hour='12');

3、查询分区数据

select 
    * 
from dept_partition2 
where day='20220401' and hour='12';
1.1.3 动态分区

动态分区时指向分区表insert数据时,被写往的分区不由用户指定,而是由每行数据的最后一个字段的值来动态决定。使用动态分区,可只用一个insert语句将数据写入多个分区。
1、动态分区相关参数
(1)动态分区功能总开关(默认true,开启)

set hive.exec.dynamic.partition=true

(2)严格模式和非严格模式
动态分区的模式,默认strict(严格模式),要求必须指定一个分区为静态分区,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。

set hive.exec.max.dynamic.parition.mode=nonstrict

(3)一条insert语句可同时创建的最大的分区个数,默认是1000

set hive.exec.max.dynamic.partitions=1000

(4)单个Mapper或者Reducer可同时创建的最大的分区个数,默认是100

set hive.exec.max.dynamic.partitions.pernode=100

(5)一条insert语句可以创建的最大的文件个数,默认100000

hive.exec.max.created.files=10000

(6)当查询结果为空时且进行动态分区时,是否抛出异常,默认false。

hive.exec.on.empty.partition=false

2、实例操作
需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition_dynamic的相应分区中。
(1)创建目标分区

create table dept_partition_dynamic(
    id int, 
    name string
) 
partitioned by (loc int) 
row format delimited fields terminated by '\t';

(2)设置动态分区

set hive.exec.dynamic.partition.mode = nonstrict;
insert into table dept_partition_dynamic 
partition(loc) 
select 
    deptno, 
    dname, 
    loc 
from dept;

(3)查看目标分区表的分区情况

show partitions dept_partition_dynamic;

1.2 分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并不是所有的数据集都可以形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的储存路径,分桶针对的是数据文件。

分桶表的基本原理是首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。

1.2.1 分桶表基本语法

1、建表语句

create table stu_buck(
    id int, 
    name string
)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

2、数据装载

  • 数据准备
    在/opt/module/hive/datas/路径上创建student.txt文件,并输入如下内容。

    1001	student1
    1002	student2
    1003	student3
    1004	student4
    1005	student5
    1006	student6
    1007	student7
    1008	student8
    1009	student9
    1010	student10
    1011	student11
    1012	student12
    1013	student13
    1014	student14
    1015	student15
    1016	student16
    
  • 导入数据到分桶中
    说明:Hive新版本(3)load数据可以直接跑MapReduce,老版的Hive(1,2)需要将数据传到一张表中,再通过查询的方式导入到分桶表中。

load data local inpath '/opt/module/hive/datas/student.txt' 
into table stu_buck;

(3)查看创建的分桶表中是否分成四个桶
在这里插入图片描述
(4)观察每个分桶中的数据

1.2.2 分桶排序表

1、建表语句

create table stu_buck_sort(
    id int, 
    name string
)
clustered by(id) sorted by(id)
into 4 buckets
row format delimited fields terminated by '\t';

2、数据装载

  • 导入数据到分桶表中

    load data local inpath '/opt/module/hive/datas/student.txt' 
    into table stu_buck_sort;
    
  • 查看创建的分桶表中是否分成4个桶
    在这里插入图片描述

  • 观察每个分桶中的数据(会发现每个分桶中的数据按照stu_id升序)

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

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

相关文章

树莓派VNC控制报错:The connection was refused by the computer 已解决

在进行VNC远程操控树莓派的时候,出现了这个错误:The connection was refused by the computer。 大概原因有两个:一个是树莓派的IP地址更改了,另一个就是树莓派的VNC服务没有开启。 我的这块板子是个新板子,原因很显…

软件测试理论

测试理论 一 测试定义及原则 1 软件定义 一些列按着特定顺序组织的计算机数据和指令的集合: 软件 数据 指令 文档 2 软件分类 工具类软件游戏类软件电商类软件社交类软件教育类软件等 3. 软件架构分类 单机软件: office、红警等分布式软件 C/…

煤矿井下定位设备,实现特殊环境下人员安全管理

煤矿、金属矿山等地下作业场所的安全管理工作要求高、难度大,矿用人员定位系统通过实时定位等功能,可以帮助企业随时掌握作业人员的位置安全,提高生产和安全管理效率,并可在紧急情况时迅速采取措施,减少事故损失&#…

云原生容器安全检测有多难?安全狗云原生安全新版六招“泰酷辣”

想借助大规模部署和使用容器应用来提升业务系统开发速度?那你一定会发现,大量的数据对象、多种安全风险都需要检测,容器的安全检测难度增加了! 安全狗发现众多企业用户对安全的要求不再停留在“能用就好”的程度,于是新…

5种超超超实用的TikTok选品方法

是不是有很多人在做TikTok Shop时不知道该如何选品,面对琳琅满目的产品纠结该上哪款产品呢?今天就给大家介绍5种超实用的TikTok选品方法。 一、选品方法 1.从用户需求方面入手 做TikTok面向的是国外,所以选品时不能以国内的市场需求做参考&…

深入剖析SQL JOIN原理,助你掌握数据连接的奥秘!

大家好,我是小米,在技术的海洋中畅游的小编。今天,我要带你探索SQL JOIN的神奇原理,为你解锁高效数据查询的技巧!无论你是初学者还是资深开发者,相信这篇文章都能给你带来新的启发。废话不多说,…

算法技巧-双指针

欢迎关 Android茶话会 回 pdf 取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍 在技术学习、个人成长的道路上,让我们一起前进! 前言 双指针技巧在算法题中算是常用技巧了,让我们省去for循环,降低复杂度&#xff…

第二十章_Redis分布式锁Redlock算法和底层源码分析

当前代码为8.0版接上一步 自研一把分布式锁,面试中回答的主要考点 按照JUC里面java.util.concurrent.locks.Lock接口规范编写 lock()加锁关键逻辑 加锁的Lua脚本,通过redis里面的hash数据模型,加锁和可重入性都要保证 加锁不成,…

NLP面经集结 | 达摩院、腾讯、微软、美团、百度

作者 | Codle 整理 | NewBeeNLP 面试锦囊之面经分享系列,持续更新中 赶紧后台回复"面试"加入讨论组交流吧 写在前面 本人情况:双非本末流985研二,爱奇艺NLP日常实习经历,无论文,投的都是 NLP 算法岗。 目前…

Ansible基础5——条件语句、循环语句、handlers、任务失败处理

文章目录 一、 循环语句1.1 单量循环1.2 多量循环1.3 老版本用法1.4 loopregister 二、条件判断2.1 根据变量状态判断2.2 根据变量是否存在判断2.3 根据事实判断2.4 多条件判断2.4.1 and用法2.4.2 or用法 2.5 循环判断2.6 根据上个任务结果判断 三、handlers处理程序四、任务失…

CDGA 认证:第十二章 元数据管理(重点章节)习题集解析

1. 以下内容不属于元数据综合解决方案功能需求点的是 ( ) A 历史信息 B 存储容量 C 运维要求 D 安全要求 【答案解析】DAMA-DMBOK2 P334 2. 关于 ISO/IEC 11179 元数据注册标准的说法正确的是:( ) A 该标准由 6 个部分组成 B 该标准用于定义元数据注册的框架 C 该标准包含…

Express+vue.js+nodejs银行排队取号系统

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 系统主要包括系统用户中心、显示管理、用户管理、排队管理、服务业务管理、用户评价管理、等候区管理等功能模块。 (a) 管理员&am…

00后求你善良,不要这么卷了...

前几天我们公司一下子也来了几个新人,这些年前人是真能熬啊,本来我们几个老油子都是每天稍微加会班就打算走了,这几个新人一直不走,搞得我们也不好走。 2023年春招结束了,最近内卷严重,各种跳槽裁员&#x…

Studio One6新生代DAW数字音频工作站

提到编曲软件,就不得不说这款水果编曲软件。它对新手和老手都比较友好,是一款较为经典的编曲软件。 这款软件提供了强大而全面的音符、音效编辑器,可以在其中插入各种乐器声音,如果内置乐器无法满足编曲需求,还可以外…

数据结构-递归

递归 概述 定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instan…

Web大前端时代之:HTML5+CSS3入门系列

Old: 联系源码:GitHub - dunitian/LoTHTML5: LoT家族的一员~HTML5系列 文档下载:https://github.com/dunitian/LoTDotNet/ 思维导图(不断更新): 图片:http://dnt.dkill.net/DNT/HTML5/index.jpg 源码&#…

超级全面的100个思维导图模板

思维导图是一款有效提升生活以及工作的效率工具。使用思维导图有非常多的好处。 思维导图可以用在我们生活的方方面面,以及各种各样的学科中。 接下来给大家分享不同的思维导图模板,希望可以帮助到大家。 一、读书笔记类 1、西游记 2、《战胜拖拉》读…

RabbitMQ - 简单案例

RabbitMQ - 简单案例 Hello worldWork Queues轮训分发消息消息应答自动应答手动消息应答的方法消息自动重新入队消息手动应答代码 RabbitMQ 持久化不公平分发 预取值分发 Hello world 我们将用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者 在下图中…

Java实现Mqtt收发消息

Java实现Mqtt收发消息 文章目录 Java实现Mqtt收发消息windows mqtt 平台服务搭建mqtt 客户端工具:mqttbox整体代码结构mqtt基础参数配置类mqtt客户端连接mqtt接收的消息处理类对应的MqttService注解和MqttTopic注解 MqttGateway 发送消息指定topic接收处理方法 java…

基于Hive的数据应用实践总结

百分位数(percentile)计算 百分位数含义:统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如&#x…