## Hive分区、桶、与倾斜

2023-11-05

Hive的分区

(1)在Hive Select 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候查询 只需要扫描表中关心的一部分数据,因此建表时引入partition概念。

(2)分区表指的是在创建表时指定的partition的分区空间。

(3)如果需要创建有分区的表,需要在create表的时候调用可选参数partition by ,详细见表创建的语法结构。

(4) 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存储在表文件夹的目录下。

(5)表和列名不区分大小写。
(6) 分区是以字段的形式在表结构中存在的,通过dsscribe table 命令可以查看到字段存在,但是该字段 不存放实际的数据内容,仅仅是分区的表示

Hive的桶表

分桶其实就是把大表化成了‘小表’,然后通过两个表相同列使用Map端连接(Map-Side Join),这就是用来解决大表与小表之间的连接问题。将桶中的数据按某列进行排序会提高查询效率。

(1)创建分桶表

CREATE TABLE tb_bucket_shop (
shop_id int,
shop_name string,
shopkeeper string,
) CLUSTERED BY (shop_id) INTO 4BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

(2)数据导入

set hvie.enforce.bucketing=true; INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb part shop CLUSTER BY shop id;

若没有使用hive. enforce.bucketing属性,则需要设置和分桶个数相匹配的reducer个数,同时SELECT后添加CLUSTER BY

set mapred.mapred.reduce.tasks=4;
INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name,
shopkeeper FROM tb part shop CLUSTER BY shop id;

分桶适合于sampling(采样),不过其数据正确地导入到hive表中,需要用户自己来证明,因为table中信息仅仅是元数据,而不影响实际填充表的命令。

(3)小结

分区分桶是hive性能优化的一个手段,不同的字段,其数值属性不同,其对应的有优化当时也不同,不能简单地认为分区分桶对应传统关系型数据库的分库分表,两者完全不一样。

Hive数据倾斜

(1)数据倾斜的原因

使map的输出数据更均匀的分布到Reduce中,是我们的最终目标。由于Hash算法的局限性,按key Hash会或多或少地造成数据倾斜。大量经验表明数据倾斜的原因是人为的建表疏忽或业务逻辑,是可以规避的。

(2)解决思路

Hive的执行是分段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀地分配到各个reduce中,就是解决数据倾斜的根本原因所在。

(3)具体办法

  • 内存优化和I/O优化。

  • 驱动表:使用大表做驱动表,以防止内存溢出;Join最右边的表是驱动表;Mapjoin无视join顺序,用大表做驱动表。

Mapjoin是一种避免数据倾斜的手段

允许在map阶段进行join操作,MapJoin把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。由于对map进行了join操作,省去了reduce运行,效率也会高很多。

在对多个表join连接操作时,将小表放在join的左边,大表放在join的右边。在执行这样的join连接时,小表中的数据会被缓存到内存当中,这样可以有效减少发生内存溢出错误的几率。

(1)设置参数

hive.map.aggr=true
hive.groupby.skewindata=true

还有其他参数,请小伙伴自行官网看相关文档。

(2)SQL语言调节

比如:在group by 维度过小时,采用sum() group by 的方式 来替换count(distinct)完成计算。

(3)StreamTable

将在reduce中进行join操作时的小table放入内存,而大table通过stream方式读取。

(4)索引

Hive从0.80开始才有索引,它提供了一个Bitmap位图索引,索引可以加快group by查询语句的执行速度,但是用的比较少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

## Hive分区、桶、与倾斜 的相关文章

随机推荐

  • Qt 助手 assistant 单独运行 及 字体设置

    曾经在 Qt creator上 不知道点击了哪里 Qt 助手也是可以单独运行的 这样就可以不需要安装字体了 但是 一直没有找到这个重现的规则 或者快捷键 1 运行Qt 助手 assistant linux 所在目录 xxxxxx Qt5 1
  • java调用 Myeclipse用jax-ws创建的webservice具体方法(三)

    首先需要下载所需的jar包 webservices所需全部jar包下载 点击打开链接 直接上代码 import java net MalformedURLException import java net URL import java r
  • 基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 2 算法运行软件版本 matlab2022a 3 部分核心程序 fine regular grid NSa
  • Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}

    org springframework beans factory BeanDefinitionStoreException Invalid bean definition with name dataSource defined in f
  • $.ajaxFileUpload上传文件出现错误...问题总结

    1 加载报错 ajaxfileupload js 1 Uncaught ReferenceError jQuery is not defined 上传报错 Uncaught TypeError ajaxFileUpload is not a
  • C++ Pat甲级1003 Emergency (25 分)图+dfs

    1003 Emergency 25 分 As an emergency rescue team leader of a city you are given a special map of your country The map sho
  • FPGA实现电机转速PID控制

    通过纯RTL实现电机转速PID控制 包括电机编码器值读取 电机速度 正反转控制 PID算法 卡尔曼滤波 最终实现对电机速度进行控制 使其能够渐近设定的编码器目标值 一 设计思路 前面通过SOPC之NIOS 实现电机转速PID控制 调用中断函
  • Android数据库升级解决方案

    方案一 第三方库ActiveAndroid数据库 在对应继承model的实体类中添加的字段 并且对应的数据库版本升级 1 在assert资源文件添加一个migrations文件夹 里面创建文件 版本号 sql 文件中添加数据库脚本 即 AL
  • 最容易理解的JavaScript解决约瑟夫环问题的方式之一

    这种方式虽然效率不是最高的 但绝对是最容易理解的思路之一 function ysf flag stayNum allNum let arr let start 1 for let i 1 i lt allNum i arr push i 当
  • 做爱做的事,做有快感的事

    还是不发首页了 最近没规划 需要缓一缓 因为发首页还是要符合几点要求的 所以就先停停 不过文章还是得写 本来十一点多就写好了 没想到洗个澡就过了十二点 今天就更像聊天了 上一篇说到拖延症 最后留下了一个尾巴 就是怎么找到不会发生拖延症的事去
  • 【Git】(四)子模块

    1 增加子模块 进入准备添加子模块所在的目录 例如library git submodule add b 1 0 0 0 git gitee com sunriver2000 SubModule git 参数 b用于指定子模块分支 2 更新
  • 刷脸支付每个人的脸都具有唯一性无法复制

    移动支付时代 手机成为承载资金的介质 人人手机里有支付宝或者微信支付 但如果手机一旦丢失 不法分子破解了用户密码 那么资金安全也面临威胁 而刷脸支付的第一大优势就在于保证用户资金安全 因为在整个支付过程中 用户完全不用打开手机和自己的资金账
  • [游戏开发][Shader]GLSLSandBox转Unity-CG语言

    官网 GLSL Sandbox Galleryhttps glslsandbox com 屏幕坐标计算 fragCoord与 ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2 a b c d 函数返回vec2
  • yolov3之数据集预处理

    目录 txt标签文件的说明 将jpg与txt文件分开 txt生成xml标签文件 xml标签详解 xml标签生成txt txt标签文件的说明 获取到的数据集是这样的 需要转换为VOC格式 其实就是将txt转换为xml文件 打开txt文件可以看
  • 在线代码编辑器:Monaco Editor

    monaco editor是微软开源的一款web版代码编辑器 它支持智能提示 代码高亮 代码格式化 Monaco Editor是为VS Code提供支持的代码编辑器 运行在浏览器环境中 编辑器提供代码提示 智能建议等功能 供开发人员远程更方
  • 2013年9月10日星期二(DEMO8_6矩阵)

    首先设置了2个矩阵 1 把所有的点存储为1 2矩阵 typedef struct MATRIX1X2 TYP float M 2 MATRIX1X2 MATRIX1X2 PTR M X Y 2把所有变换矩阵采用3 2矩阵 typedef s
  • 带你玩转kubernetes-k8s(第21篇:k8s-深入掌握Pod-初始化容器、Pod滚动升级)

    上节内容的错误 还请大家不要太在意 后面我们会解决的 理解Job的作用 概念就可以了 下面我们进入正题 Init Container 初始化容器 在很多应用场景中 应用在启动之前都需要进行如下初始化操作 等待其他关联组件正确运行 例如数据库
  • Gitbash 无法显示中文

    GitBash gt 右键 gt options gt 左侧text 设置locale zh cn 设置Character set GBK save gt apply GitBash输入 systeminfo看能否正常显示
  • 几种C/C++语言安全检测工具介绍

    转自新浪微博http www vckbase com index php wv 1635 针对C C 语言安全漏洞的分析检测也出现了大量的工具 按照不同的机理主要分为以下几类 如表所示 分析类型 机理 分析工具 备注 静态分析 预处理 Fo
  • ## Hive分区、桶、与倾斜

    Hive的分区 1 在Hive Select 查询中一般会扫描整个表内容 会消耗很多时间做没必要的工作 有时候查询 只需要扫描表中关心的一部分数据 因此建表时引入partition概念 2 分区表指的是在创建表时指定的partition的分