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

2024-05-30 23:52
文章标签 数据 操作 join hive 倾斜

本文主要是介绍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将结果进行拼接。

这篇关于hive中的join操作及其数据倾斜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017098

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

SQL Server中,always on服务器的相关操作

在SQL Server中,建立了always on服务,可用于数据库的同步备份,当数据库出现问题后,always on服务会自动切换主从服务器。 例如192.168.1.10为主服务器,12为从服务器,当主服务器出现问题后,always on自动将主服务器切换为12,保证数据库正常访问。 对于always on服务器有如下操作: 1、切换主从服务器:假如需要手动切换主从服务器时(如果两个服务

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

力扣SQL50 每位经理的下属员工数量 join

Problem: 1731. 每位经理的下属员工数量 👨‍🏫 参考题解 Code select m.Employee_id, m.name,count(*) reports_count,round(avg(e.age),0) average_agefrom Employees ejoin Employees mon e.reports_to = m.Employee_id

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

PS的一些操作~持续抄袭中....

套索工具使用时移动图片——按住空格键,鼠标左键按住,拖动!

两个基因相关性CPTAC蛋白组数据

目录 蛋白数据下载 ①蛋白数据下载 1,TCGA-选择泛癌数据  2,TCGA-TCPA 3,CPTAC(非TCGA) ②蛋白相关性分析 1,数据整理 2,蛋白相关性分析 PCAS在线分析 蛋白数据下载 CPTAC蛋白组学数据库介绍及数据下载分析 – 王进的个人网站 (jingege.wang) ①蛋白数据下载 可以下载泛癌蛋白数据:UCSC Xena (xena