原始需求
解決方案:笛卡爾積 + 排序
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值範圍裡面隨機出來的,所以複製了幾倍n,就相當於這個隨機範圍就有多大n,那麼相應的大表的資料就被隨機的分為了n份。並且最後處理所用的reduce數量也是n,不會出現資料傾斜。
這裡有產品id可以利用,使用產品id的後n位,根據實際情況而定,作為join key,這樣就會有多個reducer,也不會出現資料傾斜。
參考文章:
hive中的笛卡爾積
hive本身是不支援笛卡爾積的,不能用select t1.t2.from table 1,table 2這種語法。但有時候確實需要用到笛卡爾積的時候,可以用下面的語法來實現同樣的效果 select t1.t2.from select from table1 t1 join select from t...
hive中的笛卡爾積
hive本身是不支援笛卡爾積的,不能用select t1.t2.from table 1,table 2這種語法。但有時候確實需要用到笛卡爾積的時候,可以用下面的語法來實現同樣的效果 select t1.t2.from select from table1 t1 join select from t...
hive中笛卡爾積的優化
由於乙個業務,必須要進行笛卡爾積,但是速度太慢了,left join時左表大概4萬條資料,右表大概 3000多條資料,這樣大概就是一億多條資料,這在大資料領域其實不算很大的資料量,但是hive中跑的特別慢。因為hive對笛卡爾積支援的不是很好,由於是全域性的操作,所以只能在乙個reduce中執行,導...