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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、