hive组件二次开发之HiveF
2016-01-15 14:24
351 查看
其实这个HiveF组件很简单。用Java代码写一个拼接字符串的东西,让他可以传值。之后以hive -e "$sql" 执行该sql
下面我们来介绍main的主要代码
ParseArgs代码如下
将代码用fat jar打包,上传至服务器
在服务器上创建如下目录,其中lib存放jar包,bin上存放命令语句文件
bin下创建文件HiveF,内容如下:
在/etc/profile下注册HiveF命令
随便找个目录,下创建hive的hql,hiveFTest.hql测试内容如下
测试shell文件如下
下面我们来介绍main的主要代码
package qh.zcy.hiveF; import java.io.File; /** * * author:zl * action:完成对hive -f的封装 * time:下午5:06:53 */ public class Main { /** * ../*.sql -date "2013-01-01" * @param args * @throws Exception */ public static void main(String[] args) throws Exception { ParseArgs parse = new ParseArgs(args); String sql = Utils.getSql(new File(args[0])) ; System.out.println(Utils.parse(sql,parse.getMap())); } }
ParseArgs代码如下
package qh.zcy.hiveF; import java.util.HashMap; import java.util.Map; /** * * author:zl * action:处理main函数参数 * time:下午5:23:55 * ../*.sql -date "2013-01-01" */ 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 temp = args[i].trim(); if(temp.startsWith("-")){ String key =temp.substring(1).trim(); i++; String value=null; if(args.length>i){ value=args[i].trim(); if(value.startsWith("\"") || value.endsWith("\'")){ value=value.substring(1,value.length()-1); } } map.put(key, value); i++; }else{ i++; } } } public Map<String, String> getMap() { return map; } }utils类主要代码
package qh.zcy.hiveF; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; 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里的参数引用,替换为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 ; } }
将代码用fat jar打包,上传至服务器
在服务器上创建如下目录,其中lib存放jar包,bin上存放命令语句文件
bin下创建文件HiveF,内容如下:
. /etc/profile sql=`java -jar /data/myhiveF/lib/MyHiveF.jar $*` echo "$sql" hive -e "$sql"
在/etc/profile下注册HiveF命令
随便找个目录,下创建hive的hql,hiveFTest.hql测试内容如下
drop table test_zhang; create table test_zhang as select * from concat_test where dt="{$dt}";
测试shell文件如下
#!/bin/sh . /etc/profile dt="2015-01-12" hiveF ./hiveFTest.hql -dt "$dt"
相关文章推荐
- 安装universal-ctags
- UIKit: UIResponder(转自南峰子博客)
- 批量ssh执行命令
- 数据库删除重复数据
- 批量ssh执行命令
- 职业生涯管理系统 servlet+javabean+mysql(三)登陆的实现
- 菜鸟之路-浅谈设计模式之原型模式
- NSMutableAttributedString,图文混排,字号变换,颜色变换
- 第一章 rsyslog整体架构
- error:LNK2005 已经在*.obj中定义
- 非对称加密算法-DH算法
- 模版字符串实例:模板编译
- zabbix使用外部邮箱账号发送报警邮件设置
- 机器学习与数据挖掘网上资源搜罗
- Mybatis 中在传参时,$ 和# 的区别
- js-Event构造函数,也许你需要
- .net 连接sqlserver类库
- POJ2182(排队问题)
- 深入理解Android View
- 【转】python数据格式化之pprint