hive中的join操作及其数据倾斜

hive中的join操作及其数据倾斜

join操作是一个大数据领域一个常见的话题。归根结底是由于在数据量超大的情况下,join操作会使内存占用飙升。运算的复杂度也随之上升。在进行join操作时,也会更容易发生数据倾斜。这些都是需要考虑的问题。

过去了解到很多关于join操作的知识点,特此总结一下。

join操作可以分为三类:小表join小表、大表join小表、大表join大表

其中小表join小表是不需要考虑的,不会存在内存溢出,也不会因为数据倾斜导致查询缓慢。

一、大表join小表

大表join小表的解决方法也相对简单,那就是map-side-join。

所谓map-said-join就是将小表直接长期驻留在内存中,在map端完成join操作。

hive通过如下配置开启map-said-join:

SET hive.auto.convert.join=true;
SET hive.mapjoin.smalltable.filesize=25000000;

其中,hive.auto.convert.join参数表示是否自动转换为mapjoin,hive.mapjoin.smalltable.filesize参数表示小表的大小阈值。如果小表的大小超过这个阈值,那么Hive将不会自动转换为mapjoin。

编写带有join操作的sql语句时要将小表放在join语句的右边,如下:

SELECT /*+MAPJOIN(small_table)*/ large_table.col1, small_table.col2 
FROM large_table JOIN small_table
ON large_table.key = small_table.key;

二、大表join大表

大表join大表最常用的方法是bucket-map-join,即将大表拆分成小表,小表再做join操作。

所谓bucket-map-join就是将两个要进行join操作的表的join key上做hash bucket,将两张大表分成多张小表。join key经过hash后的值相同就分到同一个表中,此时只需要将hash相同的bucket进行join操作即可。需要注意的是,两个大表中较大的那个表所得出的hash bucket个数应该是较小的表所得出的hash bucket个数的整数倍。

各个小表依然复制到大表所在的map进行mapjoin

实现bucket-map-join的条件

1.启动bucket-map-join,set hive.optimize.bucketmapjoin = true;

2.一个表的bucket数是另一个表bucket数的整数倍

3.bucket列就是join key所在的列

4.必须是应用在map-join场景中

另一种大表join大表常用的方法是SMB join(Sort Merge Bucket Join)

SMB join相比于bucket-map-join而言多了两个限制条件:

1.要求必须有序

2.要求两个大表所生成的bucket数必须相同

下表给出两者对比:

bucket map joinSMB join
set hive.optimize.bucketmapjoin = true;set hive.optimize.bucketmapjoin = true;set hive.auto.convert.sortmerge.join=true;set hive.optimize.bucketmapjoin.sortedmerge = true;set hive.auto.convert.sortmerge.join.noconditionaltask=true;
一个表的bucket数是另一个表bucket数的整数倍两个表的bucket数必须相同
bucket列 == join列bucket列 == join列
必须是应用在map join的场景中必须是应用在bucket map join 的场景中

需要注意的是,用户需要自己保证SMB join时数据的有序。如果不是有序的,会导致结果出错。

1.hive.enforce.sorting设置为true。开启强制排序时,插数据到表中会进行强制排序,默认false

2.插入数据时可以在sql中使用distributed c1 sort by c1 或者cluster by c1

另外,表创建时必须时CLUSTERED且SORTED,如下:

create table test_smb_2(mid string,age_id string)
CLUSTERED BY(mid) SORTED BY(mid) INTO 500 BUCKETS;

##三、join操作中的数据倾斜

如果在join操作的过程中发生数据倾斜,那么就需要采用skew join来解决

skew join的打开方式:

#运行时
set hive.optimize.skewjoin=true;
#编译期
set hive.optimize.skewjoin.compiletime=true;
#开启union优化
set hive.optimize.union.remove=true;

skew join对于数据倾斜的解决方案就是单独开一个新的job,并对发生倾斜的数据进行map join。两个任务完成后使用union将结果进行拼接。

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

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

相关文章

每日5题Day15 - LeetCode 71 - 75

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;71. 简化路径 - 力扣&#xff08;LeetCode&#xff09; class Solution {public String simplifyPath(String path) {Deque<String> stack new LinkedList…

mysql的增删查改(进阶)

目录 一. 更复杂的新增 二. 查询 2.1 聚合查询 COUNT SUM AVG MAX MIN 2.1.2 分组查询 group by 子句 2.1.3 HAVING 2.2 联合查询/多表查询 2.2.1 内连接 2.2.2 外连接 2.2.3 全外连接 2.2.4 自连接 2.2.5 子查询 2.2.6 合并查询 一. 更复杂的新增 将从表名查询到…

自动化办公01 smtplib 邮件⾃动发送

目录 一、准备需要发送邮件的邮箱账号 二、发送邮箱的基本步骤 1. 登录邮箱 2. 准备数据 3. 发送邮件 三、特殊内容的发送 1. 发送附件 2. 发送图片 3. 发送超文本内容 4.邮件模板内容 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议…

霍夫曼树教程(个人总结版)

背景 霍夫曼树&#xff08;Huffman Tree&#xff09;是一种在1952年由戴维霍夫曼&#xff08;David A. Huffman&#xff09;提出的数据压缩算法。其主要目的是为了一种高效的数据编码方法&#xff0c;以便在最小化总编码长度的情况下对数据进行编码。霍夫曼树通过利用出现频率…

【Qt秘籍】[009]-自定义槽函数/信号

自定义槽函数 在Qt中自定义槽函数是一个直接的过程&#xff0c;槽函数本质上是类的一个成员函数&#xff0c;它可以响应信号。所谓的自定义槽函数&#xff0c;实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤&#xff1a; 步骤 1: 定义槽…

<jsp:setProperty>设置有参构造函数创建的自定义对象的属性

假设某一个类&#xff08;如TextConverter类&#xff09;有一个无参构造函数和一个有参构造函数&#xff0c;我们可以在Servlet里面先用有参构造函数自己new一个对象出来&#xff0c;存到request.setAttribute里面去。 Servlet转发到jsp页面后&#xff0c;再在jsp页面上用<j…

django基于大数据+Spring的新冠肺炎疫情实时监控系统设计和实现

设计一个基于Django(后端)和Spring(可能的中间件或服务集成)的新冠肺炎疫情实时监控系统涉及多个方面,包括数据收集、数据处理、数据存储、前端展示以及可能的中间件服务(如Spring Boot服务)。以下是一个大致的设计和实现步骤: 1. 系统架构 前端:使用Web框架(如Reac…

三种字符串的管理方式

NSString的三种实现方式 OC这个语言在不停的升级自己的内存管理&#xff0c;尽量的让自己的 OC的字符串 问题引入 在学习字符串的过程中间会遇到一个因为OC语言更新造成的问题 例如&#xff1a; int main(int argc, const char * argv[]) {autoreleasepool {NSString* str1 …

C++核心编程类的总结封装案例

C类的总结封装案例 文章目录 C类的总结封装案例1.立方体类的封装2.点与圆的关系的封装3.总结 1.立方体类的封装 在C中&#xff0c;我们可以定义一个立方体&#xff08;Cube&#xff09;类来封装立方体的属性和方法。立方体的属性可能包括边长&#xff08;side length&#xff…

【redis】set和zset常用命令

set 无序集合类型 sadd 和 smembers SADD&#xff1a;将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中。 语法&#xff1a;SADD key member [member] 把集合中的元素,叫做member,就像hash类型中,叫做field类似. 返回值表示本次操作,添加成功了几个元素. 时间复…

网络原理——http/https ---http(1)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 网络原理 HTTP/HTTPS HTTP,全称为"超文本传输协议" HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议. 实际上,HTTP最新已经发展到 3.0 但是当前行业中主要使用的HT…

概念解析 | 为什么SAR中的天线间隔需要是四分之一波长?

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:为什么SAR中的天线间隔需要是四分之一波长 概念解析 | 为什么SAR中的天线间隔需要是四分之一波长? 在这篇文章中,我们将深入探讨**合成孔径雷达(SAR)**系统中,为什么天…

明日周刊-第12期

以前小时候最期待六一儿童节了&#xff0c;父母总会给你满足一个愿望&#xff0c;也许是一件礼物也许是一次陪伴。然而这个世界上其实还有很多儿童过不上儿童节&#xff0c;比如某些地区的小孩子&#xff0c;他们更担心的是能不能见到明天的太阳。 文章目录 一周热点航天探索火…

LeetCode-77. 组合【回溯】

LeetCode-77. 组合【回溯】 题目描述&#xff1a;解题思路一&#xff1a;回溯背诵版解题思路三&#xff1a;0 题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&a…

Python怎么使用 SQLAlchemy 和model 查询数据呢?

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射器&#xff08;ORM&#xff09;。 假设正在使用 SQLAlchemy 并有一个模型 MyModel&#xff0c;使用这个模型以及 query 方法来查询数据库。 这里有一个基本的例子&#xff0c;说明如何使用 SQLAlchemy 的 query 方法和 wi…

算法-对列表元素划分成两个和值最大且相等的子列表

现有私募基金发行一支特殊基金产品&#xff0c;该基金认购人数上限不超过 30 人&#xff0c; 募集总金额不超过 3000W&#xff0c;每个投资人认购金额不定。该基金只能将募集到的钱用于投资两支股票&#xff0c;且要求两支股票投资金额必须相同&#xff0c;且每位投资人的钱只能…

0X JavaSE-- 集合框架【Collection(List、Set、Queue)、Map】

每一个集合类底层采用的数据结构不同&#xff0c;例如ArrayList集合底层采用了数组&#xff0c;LinkedList集合底层采用了双向链表&#xff0c;HashMap集合底层采用了哈希表&#xff0c;TreeMap集合底层采用了红黑树。**集合中存储的是引用。**即。集合中存放的是对象的地址&am…

springboot报错:Failed to start bean ‘documentationPluginsBootstrapper‘

项目场景&#xff1a; springboot项目启动时报错 问题描述 具体报错信息&#xff1a; 可能原因分析&#xff1a; 1、SpringFox的版本与Spring Boot的版本不兼容。解决这个问题&#xff0c;你可能需要检查你正在使用的SpringFox和Spring Boot的版本&#xff0c;确保它们是兼容…

一千题,No.0037(组个最小数)

给定数字 0-9 各若干个。你可以以任意顺序排列这些数字&#xff0c;但必须全部使用。目标是使得最后得到的数尽可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;给定两个 0&#xff0c;两个 1&#xff0c;三个 5&#xff0c;一个 8&#xff0c;我们得到的最…

[AIGC] 使用Flink SQL统计用户年龄和兴趣爱好

Apache Flink是一个具有强大计算能力、高吞吐量、低延迟的分布式计算框架&#xff0c;它支持批计算和流计算。Flink SQL是Flink ecosystem的一部分&#xff0c;是一种对结构化数据进行批和流处理的声明式语言。本文以一个简单的实例讲解如何使用Flink SQL来统计用户年龄和兴趣爱…