由於乙個業務,必須要進行笛卡爾積,但是速度太慢了,left join時左表大概4萬條資料,右表大概 3000多條資料,這樣大概就是一億多條資料,
這在大資料領域其實不算很大的資料量,但是hive中跑的特別慢。因為hive對笛卡爾積支援的不是很好,由於是全域性的操作,所以只能在乙個reduce中執行,導致速度比較慢。
然後想優化一下,嘗試了一些方法。
比較直接能想到的解決方案是使用mapjoin,hive較高版本中是預設開啟mapjoin的,在開啟狀態下會自動判斷是否使用mapjoin,
我看了一下我的任務,是開啟了mapjoin的
但是還是很慢,不知道是不是mapjoin沒有生效。我關了自動mapjoin試了一下,發現更慢了。。。。看來mapjoin還是有用的。。。。。
所以嘗試了一位網友的建議,很巧妙的乙個想法:
注意使用這個最好把預設的自動mapjoin關掉,set hive.auto.convert.join=false
,另外就是最好手動設定一下reduce的數量,若複製十倍,set mapred.reduce.tasks = 10,這樣比較保險,但是reduce數量也不是越大越好。
修改之後從mapjoin的600秒降到了不到300秒,大任務上可能效果明顯。
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笛卡爾積 排序
原始需求 解決方案 笛卡爾積 排序 1 hive本身不支援笛卡爾積,不能使用select t1.t2.from table 1,table 2,可以使用 select t1.t2.from t1 join t2 on 1 1 在hive的strict模式下不能用這種語法,需要先用set hive.m...