1、分析参数

args = new String[5];
args[0]="d:/3-20.sql";
args[1]="-date";
args[2]="2013-01-01";
args[3]="-date1";
args[4]="2013-11-11";

讲参数分析后键值对成对放入map中()如果第一个参数包含‘-’作为键,下一个就是作为value

package com.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();
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语句

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();

}

3、将分析的参数带入sql中

public static final String BEGIN="{$" ;
public static final String END="}" ;

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 ;
}

HiveF文件 (执行jar文件拿到拼接好的java语句,【hive -e可以在shell中执行sql,并且此文件配置到linux的环境变量下】)

hiveF ./rpt_sale_daily.hql -date $date

执行hive作业得到结果

hive2mysql

上面得到hive的结果,对配置文件进行分析删除存在的表,然后把结果从hive抽取到mysql中

hive2mysql ./aa.property -date $date

hive2mysql代码(用于拼接执行删除对应日期存在的表,和查询hive分析出来的数据插入到mysql中)

package com.cloudy.tools;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import org.apache.hadoop.metrics.spi.Util;

import com.ibeifeng.hiveF.ParseArgs;
import com.ibeifeng.hiveF.Utils;

public class Hive2Mysql {
public Hive2Mysql(String propertyName) throws Exception {
init(propertyName);
}

Properties prop = new Properties();

public void init(String propertyName) throws Exception {
InputStream stream = new FileInputStream(propertyName);
prop.load(stream);
}

public static void main(String[] args) {
try {
// if(args.length < 1)
// {
// System.out.println("pls set propertyName!");
// System.exit(1);
// }
args = new String[3];
args[0]="d:/aa.property";
args[1]="-date";
args[2]="2015-01-01";

String propertyName = args[0];
ParseArgs parse = new ParseArgs(args);
Hive2Mysql h2m = new Hive2Mysql(propertyName);
System.out.println( h2m.prop.get("Hive_sql"));
System.out.println( h2m.prop.get("Mysql_table"));
String hive_sql = h2m.prop.get("Hive_sql").toString();
hive_sql = Utils.parse(hive_sql, parse.getMap());
// System.out.println("hive_sql" + hive_sql);
String mysql_table = h2m.prop.get("Mysql_table").toString();
String mysql_columns = h2m.prop.get("mysql_columns").toString();
String mysql_delete = h2m.prop.get("mysql_delete").toString();
mysql_delete = Utils.parse(mysql_delete, parse.getMap());
// insert into mysql_table(pv,uv.huodong) values(123,234,"huodong");
String mysql_sql="insert into " + mysql_table + " (" + mysql_columns+") values(";
System.out.println("mysqldelete:" + mysql_delete);
Connection mysqlCon = MyConnection.getMySqlInstance();
Connection myHiveCon = MyConnection.getHiveInstance();
//进行hive查询
Statement stHive = myHiveCon.createStatement();
Statement stMsql = mysqlCon.createStatement();
stMsql.execute(mysql_delete);
ResultSet rsHive = stHive.executeQuery(hive_sql);
int len = hive_sql.split("from")[0].split("select")[1].trim().split(",").length;
System.out.println(len);
String value = "";
while(rsHive.next())
{
for(int i =1;i<=len;i++)
{
value += "'" + rsHive.getString(i) + "',";
}
value = value.substring(0,value.length()-1);
mysql_sql = mysql_sql + value + ")";
//System.out.println(value);
System.out.println(mysql_sql);
stMsql.execute(mysql_sql);
value ="";
mysql_sql="insert into " + mysql_table + " (" + mysql_columns+") values(";
}
//insert into mysql_table() values(123,234,"huodong")
} catch (Exception e) {
e.printStackTrace();
}
}
}

架构hive2mysql流程的更多相关文章

  1. VLC架构及流程分析

    0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析. 0x01 源码结构(Android Java相关的暂未分析) # bui ...

  2. .net erp(办公oa)开发平台架构之流程服务概要介绍

    背景 搭建一个适合公司erp业务的开发平台. 架构概要图:    流程引擎开发平台:  包含流程引擎设计器,流程管理平台,流程引擎服务.目前只使用单个数据库进行管理.  流程引擎设计器 采用silve ...

  3. Trove系列(二)—Trove 的架构和流程介绍

    Trove主要逻辑目前Trove支持用户创建一个数据库服务实例,在实例里可以创建多个数据库并进行管理.数据库服务实例目前通过Nova API来创建,然后同样通过Nova API创建一个Volume(未 ...

  4. 程序猿的日常——SpringMVC系统架构与流程回顾

    web开发经历了很漫长的时间,在国内也快有十几年的时间了.从最开始的进程级到现在的MVC经历了很多的改进和优化,本篇就主要复习了解下Spring MVC相关的知识. 发展历程 第一阶段 CGI进程响应 ...

  5. 第二十六天- C/S架构 通信流程 socket

    1.C/S架构 C/S架构:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可是物理层面)来划分的.这里客户端一般指需先安装再执行的应用程序,对操作系统依赖性较 ...

  6. 前端开发工程师 - 05.产品前端架构 - 协作流程 & 接口设计 & 版本管理 & 技术选型 &开发实践

    05.产品前端架构 第1章--协作流程 WEB系统 角色定义 协作流程 职责说明 第2章--接口设计 概述 接口规范 规范应用 本地开发 第3章--版本管理 见 Java开发工程师(Web方向) - ...

  7. 【8.0.0_r4】AMS架构与流程分析

    AMS主要用来管理应用程序的生命周期,以及其核心组件,包括Activity,Service,Provider,Broadcast,Task等 之前整体架构如下图(O上已经废弃) 新的架构比较直接,简化 ...

  8. Magento 的程序架构与流程

    以下是分别详细解读分析程序的各层次源码: MAGENTO_ROOT: //入口文件 /index.php -----–| 1.判断php版本是否大于5.22.引入Magento主要的中心类/app/M ...

  9. 基于GTID的主从架构异常处理流程

    通常情况下我们主库的binlog只保留7天,如果从库故障超过7天以上的数据没有同步的话,那么主从架构就会异常,需要重新搭建主从架构. 本文就简单说明下如何通过mysqldump主库的数据恢复从库的主从 ...

随机推荐

  1. Mysql配置innodb_flush_log_at_trx_commit

    当innodb_flush_log_at_trx_commit被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作.当这个值为1(默认值)之 ...

  2. IIR滤波器数字频带转换

    <DSP using MATLAB>(Ingle & John Proakis)3ed,书中表8.2似乎不对. <Discrete Time signal processin ...

  3. appium + python 自动化调试手机时 UiAutomator exited unexpectedly with code 0, signal null

    放上appium报错图,appium在手机里安装了appium setting 和unlock 软件,输入法也被变成了appium input ,但是就是点不到目标软件,手机也可以被cmd  adb ...

  4. 锋利的Jquery(Table,Checkbox)

    1.Table奇数偶数行 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  5. 第三方下载控件 用起来还是不错的偶!Aria

    本文主要介绍开源项目Aria的使用. 先在项目里的build 中配置compile 'com.arialyy.aria:Aria:3.1.1' //下载 开始下载 Aria.download(this ...

  6. 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置[转]

    上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习 ...

  7. redis深入学习(二)-----redis配置文件、持久化

    redis配置文件 地址 units单位 a  配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bitb  对大小写不敏感 GENERAL通用 1.daemonize 2.pidf ...

  8. Jeecg-Boot 2.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

    目录 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot项目简介 Jeecg-boot 是一款基于代码生成器的智能开发 ...

  9. Java(8)中List的遍历方式总结

    本篇文章主要讲述了List这一集合类型在Java,包括Java8中的遍历方式,不包括其他的过滤,筛选等操作,这些操作将会在以后的文章中得到提现,由List可以类推到Set等类似集合的遍历方式. pub ...

  10. 【转载】Python eval

    转载 作者博文地址:https://www.cnblogs.com/liu-shuai/ eval 功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source[, gl ...