使用hiveF对sql语句的封装
来源:互联网 发布:linux cp命令 速度 编辑:程序博客网 时间:2024/05/16 05:00
关于使用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/bashsource /etc/profilesql=`/usr/java/jdk1.7.0_67-cloudera/bin/java -jar /opt/bin/hiveF/jars/hiveF.jar $*`echo "$sql"#hive -e "$sql"if [[ "$sql" =~ ^请输入参数 ]]; then exitelse 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
2 0
- 使用hiveF对sql语句的封装
- 使用WHERE语句对SQL进行基础性的优化
- sql标签和include标签使用.封装SQL语句
- SQL语句的使用
- sql语句的使用
- sql语句的使用
- SQL语句的使用
- SQL 语句的使用
- 使用SQL语句进行数据比对
- SQL 语句对时间操作的总结
- 对SQL语句效率的分析
- sql 语句对时间操作的总结
- sql 语句中对like 的优化
- oracle对动态sql语句的处理
- sql 语句对时间操作的总结
- sql 语句对时间操作的总结
- SQL对时间处理的语句小结
- sql语句对表的操作
- 电商网站数据库设计好文章分享
- 查看 并发请求数及其TCP连接状态
- 蓝牙协议中HCI层的研究与开发
- 泛型
- QQ对接WEB网站的SDK下载
- 使用hiveF对sql语句的封装
- mac Charles 抓包
- UI17_KVO, 通知中心
- Java数组过滤
- Android仪表盘
- 一个AT指令的困惑(AT+CMGR)
- 信息系统项目管理工程师学习笔记(一)
- mysql 锁查看
- STL中的map、unordered_map、hash_map