一。HIVE streaming
在Hive中,需要實現Hive中的函式無法實現的功能時,就可以用Streaming來實現。其原理可以理解成:用HQL語句之外的語言,如Python、Shell來實現這些功能,同時配合HQL語句,以實現特殊的功能。
二。 例項
1. 日誌檔案的格式
2014-02-02 01:59:02 W3SVC1 2001:da8:7007:102::244 GET /favicon.ico - 80 - 2001:da8:7007:336:ca:f74b:eede:a024 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.1+(KHTML,+like+Gecko)+Maxthon/4.1.2.4000+Chrome/26.0.1410.43+Safari/537.1 404 0 2 2014-02-02 01:59:02 W3SVC1 2001:da8:7007:102::244 GET /index.asp - 80 - 2001:da8:7007:336:ca:f74b:eede:a024 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+Trident/7.0;+rv:11.0;+Maxthon/4.1.2.4000) 302 0 0 2014-02-02 01:59:02 W3SVC1 2001:da8:7007:102::244 GET /skin6/index.asp - 80 - 2001:da8:7007:336:ca:f74b:eede:a024 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+Trident/7.0;+rv:11.0;+Maxthon/4.1.2.4000) 200 0 0 2014-02-02 01:59:02 W3SVC1 2001:da8:7007:102::244 GET /skin6/images/head_menu_jt2.gif - 80 - 2001:da8:7007:336:ca:f74b:eede:a024 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+Trident/7.0;+rv:11.0;+Maxthon/4.1.2.4000) 200 0 0
2. 處理的目的
以空格將日誌檔案分割後,將第10個欄位的IP中的’%‘及其後邊的數字刪除
3.hive指令碼和shell內容
hive指令碼檔案
ADD FILE /home/hadoop_admin/program/bash/process_exmovielog_ipv6.sh; FROM ( FROM exmovielog SELECT TRANSFORM(*) USING 'sh process_exmovielog_ipv6.sh' AS log_date,s_sitename,s_ip,cs_method,cs_uri_stem,cs_uri_query,c_ip,user_agen,sc_status,sc_substatus,sc_win32_status )temp INSERT OVERWRITE TABLE movielog PARTITION (year,month) SELECT *,YEAR(temp.log_date),MONTH(temp.log_date);
process_exmovielog_ipv6.sh指令碼內容:
#!/bin/bash #Time : 2016-4-25 #Desc: when do hive SQL , process the ipv6 cat $1 | awk -F " " ' {
#獲取%好的位置 pos=index($10,"%"); if(pos == 0) print $1" "$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$10"\t"$11"\t"$12"\t"$13"\t"$14; else { ip=substr($10,1,pos-1); print $1" "$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"ip"\t"$11"\t"$12"\t"$13"\t"$14; } } '