Hive调优之小表Join大表

这篇具有很好参考价值的文章主要介绍了Hive调优之小表Join大表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Join:

1、小表join大表
将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率,再进一步可以使用group 让小的维表(1000条以下的记录条数)先进内存,在map端完成reduce。

select count(distinct s_id) from score;
select count(s_id) from score group by s_id; --在map端进行聚合,效率更高

2、多个表关联
多个表关联时,最好拆分成小段,避免大sql(无法控制中间Job)
3、大表Join大表
3.1、空key过滤
有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。例如key对应的字段为空,操作如下:

不过滤:
INSERT OVERWRITE TABLE jointable
SELECT a.* FROM nullidtable a JOIN ori b ON a.id = b.id;
结果:
No rows affected (152.135 seconds)
-----------------------------------------------
过滤:
INSERT OVERWRITE TABLE jointable
SELECT a.* FROM (SELECT * FROM nullidtable WHERE id IS NOT NULL ) a JOIN ori b ON a.id = b.id;
结果:
No rows affected (141.585 seconds)

3.2、空key转换
有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。例如:
3.2.1、不随机分布:

set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON 
CASE WHEN 
a.id IS NULL 
THEN 'hive' 
ELSE a.id 
END 
= b.id;
--No rows affected (52.477 seconds)   

结果:这样的后果就是所有为null值的id全部都变成了相同的字符串“hive”,及其容易造成数据的倾斜(所有的key相同,相同key的数据会到同一个reduce当中去) 为了解决这种情况,我们可以通过hive的rand函数,随记的给每一个为空的id赋上一个随机值,这样就不会造成数据倾斜
3.2.2、随机分布:

set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON 
CASE WHEN 
id IS NULL 
THEN concat('hive', rand()) 
ELSE a.id 
END 
= b.id;
--No rows affected (42.594 seconds)

实际操作:

操作示例:测试大表JOIN小表和小表JOIN大表的效率 (新的版本当中已经没有区别了,旧的版本当中需要使用小表)
1、关闭mapjoin功能(默认是打开的)

set hive.auto.convert.join = false;

2、执行小表JOIN大表语句

INSERT OVERWRITE TABLE jointable2
SELECT b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
FROM smalltable s
left JOIN bigtable  b
ON b.id = s.id;
--Time taken: 67.411 seconds 

3、执行大表JOIN小表语句

INSERT OVERWRITE TABLE jointable2
SELECT b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
FROM bigtable  b
left JOIN smalltable  s
ON s.id = b.id;
--Time taken: 69.376seconds

可以看出大表join小表或者小表join大表,就算是关闭map端join的情况下,在新的版本当中基本上没有区别了(hive为了解决数据倾斜的问题,会自动进行过滤)

MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join(在Reduce阶段完成join)。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

Hive调优之小表Join大表,hive,hadoop,数据仓库
首先是Task A,它是一个Local Task(在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中。
接下来是Task B,该任务是一个没有Reduce的MR,启动MapTasks扫描大表a,在Map阶段,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果。
由于MapJoin没有Reduce,所以由Map直接输出结果文件,有多少个Map Task,就有多少个结果文件。
案例实操:
1、开启Mapjoin功能

set hive.auto.convert.join = true; 默认为true

2、执行小表JOIN大表语句

INSERT OVERWRITE TABLE jointable2
SELECT b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
FROM smalltable s
JOIN bigtable  b
ON s.id = b.id;
--Time taken: 31.814 seconds

3、执行大表JOIN小表语句

INSERT OVERWRITE TABLE jointable2
SELECT b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
FROM bigtable  b
JOIN smalltable  s
ON s.id = b.id;
--Time taken: 28.46 seconds

参考原文链接:
原文链接:https://blog.csdn.net/weixin_43563705/article/details/103297070文章来源地址https://www.toymoban.com/news/detail-765323.html

到了这里,关于Hive调优之小表Join大表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql小表驱动大表

    摘要: 小表驱动大表是优化器从成本考虑后做出的选择 判断谁做小表时,是比较算上过滤条件后的字段+条数的总大小 小表驱动大表在执行计划中体现,第一行是小表第二行是大表。不是在show warnings体现 left join时右表过滤条件在where,优化器会转为inner join小表驱动大表。

    2024年02月08日
    浏览(34)
  • 大数据开发之Hive案例篇10-大表笛卡尔积优化

    需求描述: 表概述: 需要实现的需求 SQL代码: 运行日志: 从日志可以看到,数据倾斜了,redcue一直卡在99%不动,过一段时间就被断开了。 web页面日志: 从web页面可以看到,reduce被kill的原因是Container被ApplicationMaster给kill掉了 过一段时间整个Job都被kill掉了 因为reduce卡在了99%,所以

    2024年02月09日
    浏览(83)
  • 【大数据之Hive】二十五、HQL语法优化之小文件合并

      小文件优化可以从两个方面解决,在Map端输入的小文件合并,在Reduce端输出的小文件合并。   合并Map端输入的小文件是指将多个小文件分到同一个切片中,由一个Map Task处理,防止单个小文件启动一个Map Task,造成资源浪费。 相关参数:   合并Reduce端输出的小文件是

    2024年02月13日
    浏览(35)
  • 【hive】简单介绍hive的几种join

    common join 主要是针对数据/业务逻辑的join。 Map join , Bucket Map Join , SMB Map Join , Skew Join 是hive 针对特殊数据、场景 进行的优化。 Left Semi Join 则是 Sql 语句的优化,并且也可以应用上面的优化方案。 如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Comm

    2024年02月12日
    浏览(38)
  • Hive(27): join连接查询

    1 join概念回顾 根据数据库的三范式设计要求和日常工作习惯来说,我们通常不会设计一张大表把所有类型的数据都放在一起,而是不同类型的数据设计不同的表存储。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单

    2024年02月15日
    浏览(39)
  • HIVE语法优化之Join优化

    桶用两表关联字段,MapJoin时需要将小表填入内存,这时候,分桶就起到了作用 一个stage阶段代表一个mr执行,好几个MR,会吧每一个MR的结果都压缩 Mysql 慢查询 如果sql语句执行超过指定时间,定义该sql为慢查询,存储日志, 查问题: SQL日志,模拟慢SQL 然后查询执行计划 分组聚合 就是在

    2024年02月13日
    浏览(31)
  • Hive性能调优:Hive优化技术以及Hive集群规划

    作者:禅与计算机程序设计艺术 Apache Hive是一个开源的分布式数据仓库软件,可以用来进行数据提取、转换、加载(ETL)、查询等功能。作为Hadoop生态系统的一员,Hive具有强大的分析能力、灵活的数据定义、数据处理、数据分析和可扩展性,是一个理想的企业级数据仓库解决

    2024年02月06日
    浏览(44)
  • hive之Map Join使用方法

    目录 介绍 mapjoin的使用方法 结语         MAPJION会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce运行的时间,算是hive中的一种优化。    如上图中的流程,首先Task A在客户端本地执行,负责

    2024年02月05日
    浏览(28)
  • hive anti join 的几种写法

    t_a 表的记录如下 c1 | :———— | a | b | c | 生成 SQL 如下: t_b 表的记录如下 c1 b m 生成 SQL 如下: 我们要在t_a 中出现,而不在 t_b中出现的记录。 结果需要为: c1 a c 写法1 — 使用not in 写法2 —使用 left join 关联上的去掉 这种写法不容易读懂。 注意 left join 中 b.c1 is null 不能谓

    2024年02月09日
    浏览(41)
  • hive表的全关联full join用法

    背景:实际开发中需要用到全关联的用法,之前没遇到过,现在记录一下。需求是找到两张表的并集。 全关联的解释如下; 下面建两张表进行测试 test_a表的数据如下 test_b表的数据如下; 写第一个full join 的SQL进行查询测试 查询结果显示如下; 把两个表的结果拼在一行了,

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包