hive streaming 使用shell指令碼

Amei1314發表於2016-05-07

一。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; } } '

 

    

相關文章