HIVE Sql 笛卡尔积关联导致查询过慢问题优化

HIVE SQL 代码优化总结(容易踩坑的地方) hive的出现降低了Hadoop的使用门槛,但是同时由于代码的编写不规范导致出现数据倾斜、高IO、笛卡尔积、运行耗时长等问题,所以要对HQL进行优化。 阅读详情

大数据开发过程中可能会遇到关键词或敏感词匹配这种场景,具体来说会有两张表:

a表:包含content字段,数据量在百万级

b表:包含word字段,数据量为数万条,都是要匹配的敏感词

目标需求是把含有敏感词content都匹配出来,查询sql:

select a.content, b.word
from a
left join b
on 1=1
where instr(a.content, b.word) > 0

这种笛卡尔积的查询方式会关联出数百亿条数据,并且通过运行日志发现只有1个map和1个reduce,且超过90%时间耗费在reduce上,最后用了一个小时才跑完这个简单的sql。

那么如何优化来减少运行时间呢?

首先想到的就是通过增加reduce数,相关参数如下
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G) 
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
mapred.reduce.tasks (直接设置reduce个数)

设置完参数后实际运行发现reduce个数并没有改变,因为reduce个数在下面几种场景不受这些配置的影响

  1. 数据量小于hive.exec.reducers.bytes.per.reduce
  2. 用了Order by
  3. 有笛卡尔积
  4. 无group by的count

为了解决笛卡尔积无法增加reduce个数的问题,需要设置join key。在我的查询场景下,针对content有语种属性,将查询sql改造如下:

set mapred.reduce.tasks = 20;
select a.content, b.word
from a
left join b
on a.lang=b.lang
where instr(a.content, b.word) > 0

再次运行,运行时间缩短到6分钟,性能提升了超过10倍!

如果a和b表没有合适的字段做join,可在两表分别扩充一列字段,进行join。此方法也可以成功增加reducer个数,但性能提升要低于上面的方法:

set mapred.reduce.tasks = 20;
select a.content, b.word
from 
(select content, 1 join_col from a) m
left join 
(select word, 1 join_col from b) n
on m.join_col=n.join_col
where instr(m.content, n.word) > 0

hive中常见的问题以及解决方案 hive中常见的问题以及解决方案 1.hive表关联查询,如何解决数据倾斜问题? 倾斜原因:map输出数据按照key的hash分配到reduce中区,由于key分布不均匀,或者业务数据本身问题等造成reduce上的数据量差异过大 解决方案: (1)参数调节 hive.map.aggr = true hive.groupby.skuwindata = true 有数据倾斜的时候进行负载均衡,当选项设... 阅读详情

相关推荐

Hive原理及SQL优化

1.Hive原理Hive是构建在Hadoop上的数据仓库软件框架,支持使用SQL来读,写和管理大规模数据集合。Hive入门非常简单,功能非常强大,所以非常流行。通常来说,Hive只支持数据...

AI天才研究院 9802

大数据开发之Hive案例篇10-大表笛卡尔积优化

我们需要求每一个start_date的累积数量,那么此时我们可以先求每天的,然后求每天累积的,再求当天每一个start_date累积的,加上前一日的累积的,就是最终我们需要的数据。就算数据量提升数倍,因为 join的条件由一个 data_source 变为了两个 data_souce 、dt,大大减少了笛卡尔积的数据量,整个代码的计算量也减少了许多。同样的逻辑,表连接的方式居然就可以了,而分析函数却不行,估计一个是写内存,一个是写磁盘把。将数据倾斜严重的数据,单独拿出来执行。最终的运行时间在5分钟左右。

只是甲的博客 1995

如何优化Hive的查询性能?请详细说明查询优化的各个层面(SQL优化、配置优化、资源优化等)和具体方法。

Hive查询性能优化涉及SQL语句优化、配置参数调整、数据存储优化和资源分配等多个方面。SQL优化包括尽早过滤数据、避免笛卡尔积、小表JOIN优化和减少子查询;配置参数方面需合理设置执行引擎、并行度、内存参数和向量化执行;数据存储优化建议采用ORC/Parquet格式、数据压缩以及分区分桶策略;资源优化需调整YARN配置和JVM重用。此外,还需处理数据倾斜问题、收集统计信息分析执行计划,并通过监控工具持续优化。综合运用这些方法可以显著提升Hive查询性能。

chunzhi128的博客 1194

【图文详细 】Hive 优化策略 之 怎样做笛卡尔积

谦卑t 3622

(详细教程)opencv+pycharm+笔记本摄像头 做一个人脸识别

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 一、安装opencv-python 这里推荐使用pycharm直接安装opencv-python 打开文件——设置——python解释器——点击+号 搜索opencv-python,点击安装包,等待片刻即可安装好 检查是否安装好,新建一个项目输入以下代码,若无报错则安装好 import cv2 二、准备分类器 咱们使用opencv官方提供的分类器,包括面部识别,侧...

qq_52852432的博客 1万+

grafana 配置页面告警

Rate 下拉选择也可,保持默认也可。By label 选择一个比如选择filename。配置无数据或者错误数据的时候如何处理,这里选择 Normal (表示当做正常不会告警)单机 node_name 标签,选择一个主机,选好后单机 Show logs。单机 New floder,如果之前配置过,也可以选择。单机 Save contact point 保存即可。会跳出如下对话框(如果没有跳出就自己单机选择下)完成后会自动生成如下图,告警规则部分就配置好了。选择告警接收方式(这里选择企业微信 WeCon)

weixin_40548182的博客 3248

大数据开发之Hive案例篇7- 笛卡尔积优化一例

这种非等值连接,不能写在on子句,只能写在where子句后面,那么此时的问题就是连个表的关联变成笛卡尔积了,产生的数据量太大了,而且笛卡尔积是全局的,所以只有一个reduce,执行进程上看,reduce进度一直卡在99%不动。那么此时我们需要的是人工的给两个表一个join条件,避免只有一个reduce操作。顺便指定一下reduce的个数,以免hive自动判断的reduce数发生错误。今天遇到一个问题,一个大表join 一个拉链表,获取对应的数据。优化后,执行时间由之前的18分钟,优化到4分钟左右。

只是甲的博客 1053

微生物16S数据上传NCBI的SRA库

本篇内容仅包括:俺自己的实验收集了淡水、淡水沉积物、海水、海草附着微生物样品,测序所得的Fastq格式数据,在文章投稿发表时被要求数据需上传NCBI的SRA库,得到一个PRJNA2347899这样子的IDs。仅解决了这个上传过程!

Xf_Niu的博客 7432

hive笛卡尔积优化、join或left join 无on条件优化

正常业务中我们是不希望看见笛卡尔积的,因为它会造成数据膨胀,数据成倍增长,极有可能使得计算崩溃。但是有时因为业务需要,我们又不可避免笛卡尔积,那我们该如何做呢?接下来我们来看一种场景。 业务背景 imeis_table表中只有imei字段 数据量40亿条左右 dim_table表一张维表,数据量800+条 目的是的imeis_table表与dim_table表做笛卡尔积,结果就是40亿*800+条,显然数据量是非常大 常规写法(pyhton脚本) import os CMD = ...

lquarius的博客 4198

Win11用户文件夹中文名修改全攻略

本文详细介绍了Windows 11系统中修改中文用户文件夹名称的完整步骤。操作包含七个关键环节:前期数据备份、账户名称修改、管理员账户激活、用户文件夹重命名、注册表路径更新、收尾操作及注意事项。特别强调需要同步修改账户名、文件夹名和注册表关联路径,并建议操作前备份重要数据。文中还针对常见问题提供了解决方案,如软件报错时的符号链接创建方法。整个过程需谨慎操作,建议在管理员权限下逐步执行,修改完成后需验证系统及软件功能是否正常。

Qinti_mm的博客 3120

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

A20802013的博客 2万+

hive 中笛卡尔积的优化 (大表/小表)

目录笛卡尔积处理测试案例 笛卡尔积处理 当Hive设定为严格模式(hive.mapred.mode = strict)时,不允许在HQL语句中出现笛卡尔积,这实际说明了Hive 对笛卡尔积支持较弱。因为找不到 join key, Hive只能使用一个reducer 来完成笛卡尔积。 当然也可以使用 limit 的办法来减少某个表参与 join 的数据量,但对于需要笛卡尔积语义的需求来说,经常是一个大表和一个小表的join操作,结果仍然很大,以至于无法用单机处理,这时Map Join才是最好的解决办法。Map

雾岛与鲸的博客 3971

Springboot信息泄露以及heapdump的利用

努力是为了不平庸~安全有些时候是枯燥的,这一次,让我们先人一步,趣学渗透!

LiBai'S BLOG 3万+

Hive Sql 性能优化——看这一篇就够啦!

今天听组内SQL小王子分享了一篇Hive Sql性能优化的总结报告,甚觉精彩,赶紧来分享给大家!! 一、尽量使用索引,避免全表查询 ① 在where 和 order by 常用的字段上创建索引,提升效率的核心! ② where子句中尽量避免进行nul值判断,少使用!=,<>等操作符,等号左边避免函数、算数和其它表达式运算,这此操作都会导致索引无效,启动全表查询 ③ where 子句中将...

cindy407的博客 1万+

京东商品数据爬取实战:用Selenium+代理IP绕过最新反爬机制(附完整代码)

本文深入解析京东商品数据采集技术,详细介绍了如何利用Selenium与智能反反爬策略绕过京东最新的反爬机制。通过实战案例和完整代码,帮助开发者掌握高效采集京东商品数据的方法,包括动态参数加密、行为验证识别及分布式采集架构设计等关键技术。

cc789的博客 1058

【异常】claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径

如果claude方式1(临时):使用完整路径运行,比如:# Windows 批处理脚本示例 C:\你的脚本目录\claude . bat # PowerShell 脚本示例 C:\你的脚本目录\claude . ps1方式2(永久):将脚本所在文件夹添加到系统 PATH 环境变量(参考场景1的环境变量配置步骤),之后即可直接输入claude运行。错误核心原因:系统 PATH 环境变量中找不到claude对应的可执行文件/脚本。

奶爸的编程之路,也就一周冷个三天 3669

避坑指南:Hive数据倾斜之笛卡尔积Join的3种优化方案

本文深入剖析了Hive中笛卡尔积Join导致数据倾斜的性能症结,并提供了三种实战优化方案。针对大表小表关联场景,重点推荐使用MapJoin策略,通过将小表加载至内存以彻底规避Shuffle和Reduce阶段,从而大幅提升查询效率。此外,还介绍了常规Join调优与分治策略,帮助开发者根据数据规模选择最佳方案,有效解决这一常见性能瓶颈。

q5r6s7的博客 1025

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Hive优化总结

一、SQL本身的优化 1、只select需要的列,避免select * 2、where条件写在子查询中,先过滤再关联 3、关联条件写在on中,而不是where中 4、数据量大时,用group by代替count distinct 5、数据量小时,用in代替join 6、避免笛卡尔积 7、join时大表放后面,使用相同的连接键 7、严格格式 Hive.mapred.mode,分 nonstrict,strict,默认是nonstrict, 如果设置为strict,对三种情况限制: (1)分区表必须加分区。

GodxvA 9059

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

hive sql 怎么实现循环_Hive查询优化:

核心思想:是将hive程序当做mapreduce程序进行优化我们知道大数据场景下,不怕数据量大,就怕数据倾斜,特别要慎用count(distinct),count(distinct)容易产生倾斜问题。先来说说hive中sql语句转化为MapReduce的过程:整个编译过程分为6个阶段:1.Antlr定义Sql的语法规则,完成SQL词法,语法解析,将SQL转化为 抽象语法树AST Tree。2...

weixin_36402765的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Hive sql全方位优化详解

Hive作为大数据领域常用的数据仓库组件,在平时设计和查询时要特别注意效率。影响Hive效率的几乎从不是数据量过大,而是数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等等。对Hive的调优既包含对HiveSQL语句本身的优化,也包含Hive配置项和MR方面的调整。

sunxunyong的博客 2112

hive sql 的总结分析

1、旨在对hive sql整体总结记录 todo refer https://my.oschina.net/leejun2005/blog/75722

weixin_40809627的博客 397

Hive的SQL执行效率优化

Hive的优化 ① 工作中针对数据去重,能使用group by 就不使用distinct。使用group by 会使用多个Reduce进行处理。而distinct,所有的数据会在一个reduce中进行处理。 ②运行设置 在每次运行Hive语句时,运行最开始之前都会输出一段话: Number of reduce tasks not specified. Estimated from input data size: 1 In order to change the average load for

SunRains 2090

HQL(Hive SQL) 之查询语句专题汇总

HQL(Hive SQL) 之查询语句专题汇总 1. 背景 hive本身是一个将sql语句转换为mapreduce 程序运行的转换器 hive可以把结构化数据转换到一张表上,并提供查询和分析的功能 针对这个过程,hive从sql优化、从mapreduce优化这2个大的角度来提升hive的性能表现。 sql优化,这个基于现有的第三方组件是比较成熟的技术解决方案。但优化mapreduce则需要更多精力。因为mapreduce代码是根据模板,将sql经过这个模板,转换为mapreduce程序。 hive本身是一

xiaohu21的博客 2483

hive in/not in替换以及hive join优化

目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含一个字段,uid。  in查询 如果要查询当天登陆的注册用户,需要用in查询,hive sql如下: select login.uid fr...

dashabiooo的博客 6698

Hive——sql查询

1.简单查询 select * from table 1.1正则表达式指定列 select a,b.* from table; 1.2使用列值进行计算 类似筛选where子句,会在查询的结果中增加一列,显示false和true select a,b>5 from table; 1.3算数运算符 1.4使用函数 数学函数 聚合函数 1.5表生成函数 可以将单列扩展成多列或者多行,hive...

小咸鱼gogogo~~ 1339

Hive之表优化

一、小表、大表 Join 将 key 相对分散,并且数据量小的表放在 join 的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用 map join 让小的维度表(1000 条以下的记录条数)先进内存。在 map 端完成 reduce。 新版的 hive 已经对小表 JOIN 大表和大表 JOIN 小表进行了优化。小表放在左边和右边已经没有明显区别。 例: 1、创建大...

勇心在馨 2301
上一篇: Hive分区表增删字段(解决alter table失败问题)
下一篇: 解决spark streaming 聚合算子(shuffle)并行度200及缓存buffer不断增大的问题
soaring0121
博客等级 码龄17年 2941粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值