您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Hive -f如何封裝支持傳參數(shù)的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
需求
}Hive -f
}hiveF 封裝hive –f aa.sql
}支持傳任意多個(gè)參數(shù),實(shí)現(xiàn)shell腳本和sql文件的分離
}Java 類名 *.sql -date “2013-01-01” ….
分析
對(duì)一下sql中的分區(qū)字段${date} 進(jìn)行hiveF的封裝,讓date字段傳值和sql文件分離
create table tmp_test1 as select session_id, url, getcmsid(url) from page_views where dt='{$date}' and url like '%topicId%';
java代碼如下
main.java
package hive.hiveF; import java.io.File; public class Main { /** * * @param ../*.sql -date "2013-01-01" * @throws Exception */ public static void main(String[] args) throws Exception { // args = new String[5]; // args[0] ="c:/test.sql"; // args[1] = "-date"; // args[2] = "2013-01-01"; // args[3] = "-date1";vi hi // args[4] = "2013-11-11"; ParseArgs parse = new ParseArgs(args); String sql = Utils.getSql(new File(args[0])); System.out.println(Utils.parse(sql, parse.getMap())); // System.out.println(parse.getMap().get("date")); // System.out.println("select * from t1 limit 2"); } }
ParesArgs.java(將shell腳本中的-date "$date" 中的date值分離出來(lái),以便傳到sql文件中執(zhí)行,見(jiàn)hive_test.sh,hive_test.hql)
package hive.hiveF; import java.util.HashMap; import java.util.Map; public class ParseArgs { private Map<String,String> map = null; public ParseArgs(String[] args){ map = new HashMap<String, String>(); if(args.length == 0){ return ; } int i=0; while(i<args.length){ String par = args[i].trim(); if(par.startsWith("-")){ String key = par.substring(1).trim();//key是date value是下一個(gè)參數(shù)。i++ i++; String value = null; if(args.length > i){ value = args[i].trim(); if(value.startsWith("\"") || value.startsWith("\'")){ value = value.substring(1,value.length()-1).trim(); } } map.put(key, value); i++; }else{ i++; } } } public Map<String, String> getMap() { return map; } }
Utils.java
package hive.hiveF; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.HashMap; import java.util.Map; public class Utils { public static final String BEGIN ="{$"; public static final String END ="}"; public static String getSql(File file) throws Exception{ BufferedReader bf = new BufferedReader(new FileReader(file)); StringBuffer sqlBuffer = new StringBuffer(); String temp = null; while((temp = bf.readLine())!=null){ String tmp = temp.trim(); if(tmp.length() == 0 || tmp.startsWith("#") || tmp.startsWith("--")){ continue; } sqlBuffer.append(tmp+" "); } bf.close(); return sqlBuffer.toString(); } /** *把SQL里的參數(shù)引用,替換為map里的value * @param sql * @param map */ public static String parse(String sql , Map<String, String> map ){ int begin = sql.indexOf(BEGIN); while(begin !=-1){ String suffix = sql.substring(begin + BEGIN.length()); //data} int end = begin + BEGIN.length() + suffix.indexOf(END); String key = sql.substring(begin+BEGIN.length(),end).trim(); if(map!=null && map.get(key)!=null){ sql = sql.substring(0,begin) + map.get(key) + sql.substring(end+1,sql.length()); }else{ throw new RuntimeException("Incalid Expression..."); } begin = sql.indexOf(BEGIN); } return sql ; } }
準(zhǔn)備
1、在hive中創(chuàng)建表page_views
create table page_views ( sessionid string, url string ) partitioed by (dt string) row format delimited fields terminated by '\t' ;
2、在root目錄下創(chuàng)建文件vi pageviews
1 http://www.baidu.com/topicId=123123
2 http://www.baidu.com/topicId=14325245
3 http://www.baidu.com/topicId=432w32452
4 http://www.baidu.com/topicId=542351
4 http://www.baidu.com/topicId=5423e
5 http://www.baidu.com/topicId=54325342
6 http://www.baidu.com/topicId=2452
3 http://www.baidu.com/topicId=543222
3、加載數(shù)據(jù)到page_views中
load data local inpath '/root/pageviews' into table page_views partition (dt='2013-08-08');
4、向/usr/hiveF/lib中導(dǎo)入一個(gè)做好的udf(getCmsId)參考UDF和UDAF開(kāi)發(fā)
操作
1、在Linux文件中創(chuàng)建目錄hiveF/lib、HiveF/bin 分別存放jar包,和shell文件
2、將以上三個(gè)java程序打成hiveF3.jar包上傳到HiveF/lib文件中
3、進(jìn)入HiveF/bin目錄下創(chuàng)建兩個(gè)文件hive_test.sh,hive_test.hql,hiveF
vi hiveF
. /etc/profile sql=`java -jar /usr/hiveF/lib/hiveF3.jar $*` echo "$sql" hive -e "$sql"
vi hive_test.hql
add jar /usr/hiveF/getId.jar; create temporary function getcmsid as 'hive.GetCmsID'; drop table tmp_test1; create table tmp_test1 as select sessionid, url, getcmsid(url) from page_views where dt='{$date}' and url like '%topicId%';
vi hive_test.sh
#!/bin/bash #set -x . /etc/profile cd /opt/beifeng begin=`date -d -1days +%Y-%m-%d` begin="2013-08-08" #hive -f ./hive_test.hql hiveF3 /usr/hiveF/bin/hive_test.hql -date "$begin"
4、在/etc/profile 中將/usr/hiveF/bin添加到Path中保存退出
source /etc/profile
5、執(zhí)行shell腳本 ./hive_test.sh 完成后
感謝各位的閱讀!關(guān)于“Hive -f如何封裝支持傳參數(shù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。