hive笛卡尔积+排序

在遇到Hive中大表与小表进行笛卡尔积时,由于Hive默认仅使用1个reducer导致效率低下。为解决这个问题,可以采用给join添加join key的方法。具体做法包括扩充小表的join key并复制其条目,同时让大表的join key为随机数,以分散到多个reducer中处理,避免数据倾斜。通过利用产品ID的后n位作为join key,可以实现多reducer并行处理,提高运算速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原始需求
在这里插入图片描述

解决方案:笛卡尔积 + 排序
1)hive本身不支持笛卡尔积,不能使用select T1.*, T2.* from table_1, table_2, 可以使用 select T1.*, T2.* from T1 join T2 on 1=1;在Hive的strict模式下不能用这种语法,需要先用set hive.mapred.mode=nonstrict,设置为非strict模式才可以使用;尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能用1个reducer来完成笛卡尔积;

在这里插入图片描述

2)但是如果左表很大,大表和小表做笛卡尔积时,Hive只能用1个reducer来完成笛卡尔积,速度会非常慢;避免笛卡尔积的方法是,给join添加一个join key。
原理很简单:将小表扩充一列join key,并将小表的条目复制数倍,join key 各不相同;将大表扩充一列join key为随机数。
精髓在于复制几倍,最后就有几个reduce来做,而且大表的数据是前面小表扩张key值范围里面随机出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值