Hive Tips Hive使用技巧

http://blog.sina.com.cn/s/blog_6a7df1f1010197d2.html

在Hive中萎战,某些小技巧可以讓我們的Job執(zhí)行得更快分瘾,有時一點小小的改動就可以讓性能得到大幅提升,這一點其實跟SQL差不多叠聋。
首先柒爸,Hive != SQL,雖然二者的語法很像西傀,但是Hive最終會被轉化成MapReduce的代碼去執(zhí)行斤寇,所以數據庫的優(yōu)化原則基本上都不適用于 Hive。也正因如此拥褂,Hive實際上是用來做計算的娘锁,而不像數據庫是用作存儲的,當然數據庫也有很多計算功能饺鹃,但一般并不建議在SQL中大量使用計算莫秆,把數據庫只當作存儲是一個很重要的原則。
一悔详、善用臨時表
在處理海量數據時我們通常會對很多大表進行操作镊屎,基于Hadoop現(xiàn)在的局限性,不能像分布式并行數據庫那樣很好地在分布式環(huán)境利用數據局部性茄螃,Hadoop對于大表只能全表掃描并篩選數據缝驳,而每一次對大表的掃描都是苦不堪言的。(最后知道真相的我眼淚掉下來。用狱。运怖。)
所以我們會用到在編碼中經常用到的重構技巧,提取公共變量夏伊,在Hive中摇展,就是創(chuàng)建臨時表。
例如:現(xiàn)在要對三個表A溺忧、B咏连、C進行處理,Hive QL是:
select T1., T2. from

(select id, name from A) T1

join

(select id, price, feedback, type from B) T2

on T1.id = T2.id;
select T1., T2. from

(select id, type from C) T1

join

(select id, price,feedback, attribute from B) T2

on T1.id = T2.id;
這里A表和C表只會被掃描一次鲁森,而B表會被掃描兩次捻勉,如果B表的數據量很大,那么掃描B表的時間將會占用很大一塊刀森。
這里我們可以先創(chuàng)建一個臨時表:
create table temp_B as select id, price, feedback, type, attribute from B;
這個表只有B表的部分字段,所以大小會小很多报账,這里會對B表全表掃一遍研底。
然后可以用臨時表和A、C表做join運算:
select T1., T2. from

(select id, name from A) T1

join

(select id, price, feedback, type from temp_B) T2

on T1.id = T2.id;
select T1., T2. from

(select id, type from C) T1

join

(select id, price,feedback, attribute from temp_B) T2

on T1.id = T2.id;
這樣任務的執(zhí)行速度將會有極大提升透罢!盡管看起來多了一條Hive QL榜晦,但是后兩個任務需要掃描的數據將會變得很小。
二羽圃、一次執(zhí)行多個COUNT
如果我們要對多種條件進行COUNT乾胶,可以利用case語句進行,這樣一條Hive QL就可以完成了朽寞。
select count(case when type = 1 then 1 end), count(case when type = 2 then 1 end) from table;
三识窿、導出表文件
首先需要用create table在HDFS上生成你所需要的表,當需要從HDFS上將表對應的文件導出到本地磁盤時有兩種方式:
1脑融、如果需要保持HDFS上的目錄結構喻频,原封不動地復制下來,采用下面的命令:
set hive.exec.compress.output='false';
INSERT OVERWRITE LOCAL DIRECTORY '/home/hesey/directory' select * from table;
這樣下載下來的目錄中會有很多由Reducer產生的part-文件肘迎。
2甥温、如果想把表的所有數據都下載到一個文件中,則采用下面的命令:
hadoop dfs -getmerge hdfs://hdpnn:9000/hesey/hive/table /home/hesey/table.txt
這樣所有文件會由Hadoop合并后下載到本地妓布,最后就只有/home/hesey/table.txt這一個文件姻蚓。
四、UDF
在Hive中很多時候都需要做一些復雜的計算或者邏輯處理匣沼,這時候Hive本身作為一個通用框架沒法很好地支持狰挡,所以有了UDF(User Defined Function)。
1、使用UDF
(a)如果是已經上傳到Hive服務器的UDF圆兵,可以直接用
create temporary function dosomething as 'net.hesey.udf.DoSomething';
聲明臨時函數跺讯,然后在下面的Hive QL中就可以調用dosomething這個方法了。
(b)如果是自己編寫的UDF殉农,需要在聲明臨時函數前再加一行:
add jar /home/hesey/foo.jar
這樣就可以把自定義的UDF加載進來刀脏,然后和(a)一樣聲明臨時函數就可以了。
2超凳、編寫UDF
編寫UDF十分簡單愈污,引入hive-exec包,繼承org.apache.hadoop.hive.ql.exec.UDF類轮傍,實現(xiàn)evaluate方法即可暂雹,方法的輸入和輸出參數類型就是當你在Hive中調用時的輸入和返回值。
例如:
public Text evaluate(final LongWritable number);
(Text和LongWritable是org.apache.hadoop.io下面的類)
這樣我們就可以定義自己的函數并方便地在Hive中調用创夜,而不需要寫一個重量級的MapReduce杭跪。
五、笛卡爾積
Hive本身是不支持笛卡爾積的驰吓,不能用select T1.
, T2.* from table_1, table_2這種語法涧尿。但有時候確實需要用到笛卡爾積的時候,可以用下面的語法來實現(xiàn)同樣的效果:
select T1., T2. from

(select * from table1) T1

join

(select * from table2) T2

on 1=1;
其中on 1=1是可選的檬贰,注意在Hive的Strict模式下不能用這種語法姑廉,需要先用set hive.mapred.mode=nonstrict;設為非strict模式就可以用了。
六翁涤、join的規(guī)則
當Hive做join運算時桥言,join前面的表會被放入內存,所以在做join時葵礼,最好把小表放在前面号阿,有利于提高性能并防止OOM。
七鸳粉、排序
在SQL中排序通過ORDER by實現(xiàn)倦西,Hive中也支持這種語法,但是使用ORDER by時最終所有的數據會匯總到一個Reducer上進行排序赁严,可能使得該Reducer壓力非常大扰柠,任務長時間無法完成。
如果排序只要求保證Value有序而Key可以無序疼约,例如要統(tǒng)計每個用戶每筆的交易額從高到低排列卤档,只需要對每個用戶的交易額排序,而用戶ID本身不需要排序程剥。這種情況采用分片排序更好劝枣,語法類似于:
select user_id, amount from table distribute by user_id sort by user_id, amount
這里用到的不是ORDER by汤踏,而是distribute by和sort by,distribute by標識Map輸出時分發(fā)的Key舔腾。
這樣最后排序的時候溪胶,相同的user_id和amount在同一個Reducer上被排序,不同的user_id可以同時分別在多個Reducer上排序稳诚,相比ORDER by只能在一個Reducer上排序哗脖,速度有成倍的提升。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末扳还,一起剝皮案震驚了整個濱河市才避,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氨距,老刑警劉巖桑逝,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俏让,居然都是意外死亡楞遏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門首昔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寡喝,“玉大人,你說我怎么就攤上這事沙廉。” “怎么了臼节?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵撬陵,是天一觀的道長。 經常有香客問我网缝,道長巨税,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任粉臊,我火速辦了婚禮草添,結果婚禮上,老公的妹妹穿的比我還像新娘扼仲。我一直安慰自己远寸,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布屠凶。 她就那樣靜靜地躺著驰后,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矗愧。 梳的紋絲不亂的頭發(fā)上灶芝,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音,去河邊找鬼夜涕。 笑死犯犁,一個胖子當著我的面吹牛,可吹牛的內容都是我干的女器。 我是一名探鬼主播酸役,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晓避!你這毒婦竟也來了簇捍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俏拱,失蹤者是張志新(化名)和其女友劉穎暑塑,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體锅必,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡事格,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搞隐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹愚。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖劣纲,靈堂內的尸體忽然破棺而出逢捺,到底是詐尸還是另有隱情,我是刑警寧澤癞季,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布劫瞳,位于F島的核電站,受9級特大地震影響绷柒,放射性物質發(fā)生泄漏志于。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一废睦、第九天 我趴在偏房一處隱蔽的房頂上張望伺绽。 院中可真熱鬧,春花似錦嗜湃、人聲如沸奈应。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钥组。三九已至,卻和暖如春今瀑,著一層夾襖步出監(jiān)牢的瞬間程梦,已是汗流浹背点把。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屿附,地道東北人郎逃。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓线罕,卻偏偏與公主長得像豪娜,于是被迫代替她去往敵國和親枫甲。 傳聞我的和親對象是個殘疾皇子双霍,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容