使用hiveF对sql语句的封装
关于使用hiveF对sql语句的封装,平时我们使用 hive –e “$sql” 进行操作,由于sql语句会很长,造成shell脚本很长阅读不便,且不利用于维护。
现在提供hiveF 对sql 进行封装,具体使用如下:
1、解析sql文件中的参数,并转换成map对象。
package com.hexun.hiveF; import java.util.HashMap; import java.util.Map; /** * 解析sql文件中的参数,并转换成map对象。 * @author Administrator * */ 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(); 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; } }
2、解析sql文件中的SQL语句,并返回解析后的语句
package com.hexun.hiveF; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Map; /** * 解析sql文件中的SQL语句,并返回解析后的语句 * @author Administrator * */ 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里的参数引用,替换为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()); 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("Invalid Expression....."); } begin = sql.indexOf(BEGIN); } return sql; } }
package com.hexun.hiveF; import java.io.File; /** * hiveF的客户端 * * eg : hiveF /opt/bin/jar/test.sql -yesterday 20151015 -today 20151016 -hour 15 * * 第一个参数为sql文件的全路径,第二、三参数等为sql语句中的参数,且格式为: -key value。 * * @author Administrator * */ public class Main { public static void main(String[] args) throws Exception { if (args == null || args.length == 0) { System.out.println("请输入参数,第一个参数为sql文件的全路径,第二、三等为sql语句中的参数: -key value,例如: hiveF /opt/bin/jar/test.sql -yesterday 20151015 -today 20151016 -hour 15 "); return; } ParseArgs parse = new ParseArgs(args); String sql = Utils.getSql(new File(args[0])); System.out.println(Utils.parse(sql, parse.getMap())); } }
#!/bin/bash source /etc/profile sql=`/usr/java/jdk1.7.0_67-cloudera/bin/java -jar /opt/bin/hiveF/jars/hiveF.jar $*` echo "$sql" #hive -e "$sql" if [[ "$sql" =~ ^请输入参数 ]]; then exit else hive -e "$sql" fi
5、测试实例:
test.sql
insert overwrite table default.kwu_tracklog PARTITION (day="${yesterday}",hour="${hour}") select datetime,ip,cookieid,userid, logserverip,referer, requesturl ,remark1,remark2,alexaflag,ua,wirelessflag from ods.tracklog where day="${today}" and length(datetime)=12 limit 25000
sql语句中有三个参数:
yesterday, hour, today
hiveF以–key value 来传递参数:
hiveF test.sql -yesterday 20151015-today 20151016 -hour 15
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: [hadoop hive] hive总结
- 下一篇: 几种保存Hive查询结果的方法