hive笛卡尔积+排序

原始需求
hive笛卡尔积+排序_第1张图片

解决方案:笛卡尔积 + 排序
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来完成笛卡尔积;

hive笛卡尔积+排序_第2张图片

2)但是如果左表很大,大表和小表做笛卡尔积时,Hive只能用1个reducer来完成笛卡尔积,速度会非常慢;避免笛卡尔积的方法是,给join添加一个join key。
原理很简单:将小表扩充一列join key,并将小表的条目复制数倍,join key 各不相同;将大表扩充一列join key为随机数。
精髓在于复制几倍,最后就有几个reduce来做,而且大表的数据是前面小表扩张key值范围里面随机出来的,所以复制了几倍n,就相当于这个随机范围就有多大n,那么相应的大表的数据就被随机的分为了n份。并且最后处理所用的reduce数量也是n,不会出现数据倾斜
这里有产品ID可以利用,使用产品ID的后n位,根据实际情况而定,作为join key,这样就会有多个reducer,也不会出现数据倾斜

hive笛卡尔积+排序_第3张图片
参考文章:
https://blog.csdn.net/lirika_777/article/details/89330006
https://www.jianshu.com/p/159842671877
https://www.cnblogs.com/qingyunzong/p/8847775.html#_label3

你可能感兴趣的:(hive数据处理)