Hive 系列(五)—— Hive 分区表和分桶表

Hive 之 查询 04-分桶及抽样查询 记录了Hive查询中的 分桶及抽样查询 相关知识。 阅读详情

一、分区表

1.1 概念

Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。

分区为 HDFS 上表目录的子目录,数据按照分区存储在子目录中。如果查询的 where 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。

这里说明一下分区表并 Hive 独有的概念,实际上这个概念非常常见。比如在我们常用的 Oracle 数据库中,当表中的数据量不断增大,查询数据的速度就会下降,这时也可以对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据存放到多个表空间(物理文件上),这样查询数据时,就不必要每次都扫描整张表,从而提升查询性能。

1.2 使用场景

通常,在管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。

1.3 创建分区表

在 Hive 中可以使用 PARTITIONED BY 子句创建分区表。表可以包含一个或多个分区列,程序会为分区列中的每个不同值组合创建单独的数据目录。下面的我们创建一张雇员表作为测试:

 CREATE EXTERNAL TABLE emp_partition(
    empno INT,
    ename STRING,
    job STRING,
    mgr INT,
    hiredate TIMESTAMP,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2)
    )
    PARTITIONED BY (deptno INT)   -- 按照部门编号进行分区
    ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
    LOCATION '/hive/emp_partition';
复制代码

1.4 加载数据到分区表

加载数据到分区表时候必须要指定数据所处的分区:

# 加载部门编号为20的数据到表中
LOAD DATA LOCAL INPATH "/usr/file/emp20.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=20)
# 加载部门编号为30的数据到表中
LOAD DATA LOCAL INPATH "/usr/file/emp30.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=30)
复制代码

1.5 查看分区目录

这时候我们直接查看表目录,可以看到表目录下存在两个子目录,分别是 deptno=20 和 deptno=30,这就是分区目录,分区目录下才是我们加载的数据文件。

# hadoop fs -ls  hdfs://hadoop001:8020/hive/emp_partition/
复制代码

这时候当你的查询语句的 where 包含 deptno=20,则就去对应的分区目录下进行查找,而不用扫描全表。

二、分桶表

1.1 简介

分区提供了一个隔离数据和优化查询的可行方案,但是并非所有的数据集都可以形成合理的分区,分区的数量也不是越多越好,过多的分区条件可能会导致很多分区上没有数据。同时 Hive 会限制动态分区可以创建的最大分区数,用来避免过多分区文件对文件系统产生负担。鉴于以上原因,Hive 还提供了一种更加细粒度的数据拆分方案:分桶表 (bucket Table)。

分桶表会将指定列的值进行哈希散列,并对 bucket(桶数量)取余,然后存储到对应的 bucket(桶)中。

1.2 理解分桶表

单从概念上理解分桶表可能会比较晦涩,其实和分区一样,分桶这个概念同样不是 Hive 独有的,对于 Java 开发人员而言,这可能是一个每天都会用到的概念,因为 Hive 中的分桶概念和 Java 数据结构中的 HashMap 的分桶概念是一致的。

当调用 HashMap 的 put() 方法存储数据时,程序会先对 key 值调用 hashCode() 方法计算出 hashcode,然后对数组长度取模计算出 index,最后将数据存储在数组 index 位置的链表上,链表达到一定阈值后会转换为红黑树 (JDK1.8+)。下图为 HashMap 的数据结构图:

图片引用自:HashMap vs. Hashtable

1.3 创建分桶表

在 Hive 中,我们可以通过 CLUSTERED BY 指定分桶列,并通过 SORTED BY 指定桶中数据的排序参考列。下面为分桶表建表语句示例:

  CREATE EXTERNAL TABLE emp_bucket(
    empno INT,
    ename STRING,
    job STRING,
    mgr INT,
    hiredate TIMESTAMP,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2),
    deptno INT)
    CLUSTERED BY(empno) SORTED BY(empno ASC) INTO 4 BUCKETS  --按照员工编号散列到四个 bucket 中
    ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
    LOCATION '/hive/emp_bucket';
复制代码

1.4 加载数据到分桶表

这里直接使用 Load 语句向分桶表加载数据,数据时可以加载成功的,但是数据并不会分桶。

这是由于分桶的实质是对指定字段做了 hash 散列然后存放到对应文件中,这意味着向分桶表中插入数据是必然要通过 MapReduce,且 Reducer 的数量必须等于分桶的数量。由于以上原因,分桶表的数据通常只能使用 CTAS(CREATE TABLE AS SELECT) 方式插入,因为 CTAS 操作会触发 MapReduce。加载数据步骤如下:

1. 设置强制分桶

set hive.enforce.bucketing = true; --Hive 2.x 不需要这一步
复制代码

在 Hive 0.x and 1.x 版本,必须使用设置 hive.enforce.bucketing = true,表示强制分桶,允许程序根据表结构自动选择正确数量的 Reducer 和 cluster by column 来进行分桶。

2. CTAS导入数据

INSERT INTO TABLE emp_bucket SELECT *  FROM emp;  --这里的 emp 表就是一张普通的雇员表
复制代码

可以从执行日志看到 CTAS 触发 MapReduce 操作,且 Reducer 数量和建表时候指定 bucket 数量一致:

1.5 查看分桶文件

bucket(桶) 本质上就是表目录下的具体文件:

三、分区表和分桶表结合使用

分区表和分桶表的本质都是将数据按照不同粒度进行拆分,从而使得在查询时候不必扫描全表,只需要扫描对应的分区或分桶,从而提升查询效率。两者可以结合起来使用,从而保证表数据在不同粒度上都能得到合理的拆分。下面是 Hive 官方给出的示例:

CREATE TABLE page_view_bucketed(
	viewTime INT, 
    userid BIGINT,
    page_url STRING, 
    referrer_url STRING,
    ip STRING )
 PARTITIONED BY(dt STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS SEQUENCEFILE;
复制代码

此时导入数据时需要指定分区:

INSERT OVERWRITE page_view_bucketed
PARTITION (dt='2009-02-25')
SELECT * FROM page_view WHERE dt='2009-02-25';
复制代码

参考资料

  1. LanguageManual DDL BucketedTables
Hive 分桶表核心知识点 1.Hive 分桶表操作 1.1 数据分桶的定义 分桶是相对分区进行更细粒度的划分。 分桶将整个 hive 表数据内容按照某列属性值的 hash 值进行分区,通过分区将这些表数据划分到多个文件中进行存储。 其实桶的概念就是 MapReduce 分区的概念。物理上每个桶就是目录里的一个文件,一个任务作业产生的桶(即:输出文件)数量和设置的 reduce 任务个数相等。 假设有 hive 表:test_student,按照其字段 s_id 属性分为 3 个桶,那么就是对 s_id 属性值的 hash. 阅读详情

相关推荐

Hive的分区表和分桶表的区别

1,Hive分区。      是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。 ...

Null的博客 2万+

hive partition 分区详解一

一.查看分区命令 1.show partitions xxx hive> show partitions xxx; OK day=20150908 day=20151020 day=20151021 day=20151022 ... day=20160318 Time taken: 0.139 seconds, Fetched: 144 row(s) 由此可见上述命令显示了基

bitcarmanlee的博客 3万+

hive:分桶表和分区表的区别, 分桶表,抽样查询

load的本质是把文件复制再上传>>没有经过map reduce>>数据没有进行拆分>>解决: 使用insert into , 写20个insert 非常不方便>> 创建一个表, 把数据放到表里, 再用insert into。如果把A表B表做成分桶表,按照id分成2个桶, 那么A表和B表分别产生了0号桶和1号桶, 现在A表和B表连接只需要交互50次,即0号桶和0号桶交互(25), 1号桶和1号桶交互。余数为2进2号桶...从2号桶开始抽, 抽取桶的总数=桶的总数/y=4/4=1,即只抽1个桶。

weixin_40121264的博客 1362

Hive排查问题查看表及分区详细信息命令记录~

Hive中常用排错的命令 1、显示Table和Partition的详细信息 -- 获取table详细描述信息、存储格式等 desc formatted test; 通过上述命令,可以查询出来存储格式、表在hdfs实际存储的目录,表的基本信息等都可以列出来,有利于排查问题。 2、分区信息查看 -- 显示test表分区信息 show partitions test; -- 显示te...

阿尼古 1万+

Hive中的数据导入和导出、分区表和分桶表的使用与区别详解

目录 一、Hive数据导入 二、Hive数据导出 三、Hive的分区表 1.1 为什么要分区? 1.2 外部分区表综合练习 四、Hive的分桶表 1.1 分桶表原理 1.2 作用 1.3 案例演示:创建分桶表 五、分区表和分桶表的区别 一、Hive数据导入 1 直接向表中插入数据(强烈不推荐使用) hive (myhive)> create table score3 like score; hive (myhive)> insert into table score3

weixin_43230682的博客 3131

[Hive基础]-- 查看hive 表在hdfs上的存储路径

1、执行hive,进入hive窗口 2、执行show databases,查看所有的database; 3、执行use origin_ennenergy_onecard; 则使用origin_ennenergy_onecard数据库 4、执行show create table M_BD_T_GAS_ORDER_INFO_H;则可以查看table在hdfs上的存储路径 如下: hive (...

欢迎来到我的博客,一起探索代码里的世界! 5万+

Hive 系列(五)—— Hive 分区表和分桶表

一、分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中。如果查询的where字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。 这里说明一下分区表并Hive独有的概念,实际上这个概念非常常见。比如在...

黑白影的博客 1118

【Hive大数据】Hive分区表与分桶表使用详解

Hive分区表与分桶表使用详解

congge_study的博客 6646

Hive 分区表 & 分桶表

八、Hive 分区表 & 分桶表 1.分区表 Ⅰ.分区表基本操作 Ⅱ.二级分区 Ⅲ.动态分区 Ⅳ.手工创建的分区目录,如何让数据与分区信息进行关联 2.分桶表 Ⅰ.分桶表基本操作 Ⅱ.抽样查询

扛麻袋的少年的博客 5555

(03)Hive的相关概念——分区表、分桶表

Hive的相关概念——分区表、分桶表

爱吃辣条的博客 2531

磁带库Scalar i6000界面基本操作步骤

(注:磁带库的前面的门不要打开,日常维护:主要就是简单看下磁带库的状态;绿色代表正常;黄色代表报警但不影响磁带库正常使用;红色代表报警,不能正常使用,及时和厂家联系报修。) 一、磁带库管理页面 1、首先,磁带库前面(具体作用如图) 2、查看状态和管理页面 3、管理页面登陆。用户名:service 密码:xxxxxx 4、磁带机背面 二、电脑连接磁带库进入管理页面 1.用网线把电脑和磁带库的维护接口(磁带库背面)进行连接 2.电脑环境:JAVA。把电脑的IP设置成自...

杀神lwz的博客 5352

一文彻底学会hive分桶表(实战详解)

本文目录一、分桶表概述1.1、什么是分桶表?1.2、分桶表和分区表有啥区别?二、分桶表实战2.1、创建一个分桶表2.2、准备数据2.3、向分桶表导入数据2.3.1、错误导入示范(引出分桶的本质)2.3.2、正确导入示范(引出分桶规则)2.4、分桶抽样三、总结3.1、分桶表的优点3.2、常用操作3.3、分桶表的实质及与分区表的区别 一、分桶表概述 1.1、什么是分桶表? 分桶是将数据集分解成更容易管...

静待花开 1万+

冒险岛脚本函数大全:cm.sendYesNo和cm.warp的20个实战用法

本文深入解析了冒险岛脚本中cm.sendYesNo和cm.warp两个核心函数的20个实战应用场景。从基础的确认对话框交互、条件判断,到复杂的装备强化系统、动态传送与副本入口逻辑,文章通过大量代码示例展示了如何组合运用这两个函数,实现从简单NPC到复杂任务系统的进阶脚本开发,并分享了状态管理、错误处理与性能优化等最佳实践。

t4y5u6i7o的博客 1060

Hive中的分区表与分桶表详解

不过,并非所有的数据集都可形成合理的分区。分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的 hash 值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。动态分区的模式,默认 strict(严格模式),要求必须指定至少一个分区为静态分区,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。命令后,分区元数据会被删除,而 HDFS 的分区路径不会被删除,同样会导致 Hive 的元数据和 HDFS 的分区路径不一致。

qq_45115959的博客 3668

利用Docker Compose简化openGauss多节点容器化部署

本文详细介绍了如何利用Docker Compose简化openGauss多节点容器化部署,从环境准备到配置文件编写,再到集群部署与验证,提供了一套完整的解决方案。通过Docker Compose,原本复杂的手动部署流程被大幅简化,显著提升了部署效率和可靠性,特别适合企业级开源数据库的高可用架构需求。

weixin_30338481的博客 60

保姆级教程:用YOLOv5+ROS2 Humble搞定奥比中光Dabai DCW深度相机的3D物体定位

本教程详细介绍了如何使用YOLOv5模型和ROS2 Humble系统,结合奥比中光Dabai DCW深度相机实现3D物体定位。从环境配置、模型部署到深度数据融合,提供完整的实战指南,帮助开发者快速掌握三维坐标提取技术,适用于机器人开发和计算机视觉应用。

weixin_26765363的博客 270

hive 建表,分桶表(clustered by)、分桶且桶内排序(clustered by+sorted by)、分区表(partitioned by)、分区分桶一起用

一、分桶表 1、建表语句 create table test_bucket_sorted ( id int comment 'ID', name string comment '名字' ) comment '测试分桶' clustered by(id) sorted by (id) into 4 buckets ROW FORMAT DELIMITED FIELDS TERMINATED ...

祁东握力的博客 2万+

基于PyQt5的ROS移动机器人的人机交互UI界面

每次做实验的时候,手动rosrun,roslaunch太过麻烦,通过ui界面的话,只需要点点按钮就可以啦 ros_car_py包括运动,建图,导航,ui界面的程序全部打包上传,相互依赖关系见ros_car_py包。 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets imp...

工大机器人工作室 7366

一分钟搞明白hive分区表和分桶表的区别

1.两者的区别 (1)分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于hive是读模式,所以对添加进分区的数据不做模式校验。分桶表的数据时按住某些分桶字段进行hash散列 相乘的多个文件,所以数据的准确性高很多 (2)分区表是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹 (3)分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结

Li_Jian_Hui_的博客 2万+

告别Modern Standby!Win10/11强制S3睡眠的终极指南(含BIOS设置避坑)

本文是针对Windows 10/11用户因Modern Standby(S0低电量待机)导致睡眠耗电、发热问题的终极解决方案。文章详细对比了Modern Standby与传统S3睡眠(Suspend to RAM)的本质区别,并提供了从系统诊断、注册表修改、BIOS/UEFI设置避坑到驱动优化的完整步骤,旨在帮助用户强制启用稳定、省电的S3睡眠模式,彻底告别睡眠噩梦。

n7o8p的博客 794

使用ggplot2包中的双Y轴功能在R语言中可视化时间序列数据,并在时序数据末尾添加数值标签是一种有效的数据展示方式

使用ggplot2包中的双Y轴功能在R语言中可视化时间序列数据,并在时序数据末尾添加数值标签是一种有效的数据展示方式。通过这种方式,我们可以同时展示两个变量的趋势,并在时序数据末尾添加数值标签,使得数据更加直观和易于理解。假设我们有一个包含两个变量的时间序列数据集,一个是时间变量,另一个是对应的数值变量。现在,我们可以使用ggplot2包来创建一个基本的时间序列图,其中包含两个数值变量。接下来,我们将添加一个双Y轴,并在时序数据末尾添加数值标签。函数在数值1的每个数据点上添加数值标签。

Orion_O的博客 269

大数据之hive分区表和分桶表的区别

(一)二者的区别 (1)分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于hive是读模式,所以对添加进分区的数据不做模式校验。分桶表的数据时按住某些分桶字段进行hash散列 相乘的多个文件,所以数据的准确性高很多 (2)分区表是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹 (3)分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区...

qq_38603049的博客 6598

【linux】解决报错:Network error: Connection refused

【linux】解决报错:Network error: Connection refused

weixin_44502754的博客 4936

Python大数据之Hadoop学习——day07_Hive分区表和分桶表

创建分区表:create [external] table [if not exists] 表名(字段名 字段类型,字段名 字段类型,...) partitioned by (一级分区字段名 分区字段类型, 二级分区字段名 分区字段类型 , ...);自动生成分区目录并插入数据:load data [local] inpath '文件路径' into table 分区表名 partitioned (一级分区字段名='值',二级分区字段名='值' , ...);

weixin_46010015的博客 2275

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Hive 系列(六)—— Hive 视图和索引
下一篇: Hive 系列(四)—— Hive 常用 DDL 操作
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值