文档章节

Hive -f 封装支持传参数

simpler
 simpler
发布于 2014/05/28 14:29
字数 751
阅读 427
收藏 0

需求

}Hive    -f 

}hiveF  封装hive –f    aa.sql

}支持传任意多个参数,实现shell脚本和sql文件的分离

}Java  类名  *.sql  -date  “2013-01-01”  ….

分析

对一下sql中的分区字段${date} 进行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值分离出来,以便传到sql文件中执行,见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是下一个参数。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里的参数引用,替换为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 ;
    }

}

   

准备

1、在hive中创建表page_views

create table page_views (
             sessionid string,
             url string  ) partitioed by (dt string) 
             row format delimited fields terminated by '\t' ;

2、在root目录下创建文件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、加载数据到page_views中

load data local inpath '/root/pageviews' into table page_views partition (dt='2013-08-08');

4、向/usr/hiveF/lib中导入一个做好的udf(getCmsId)参考UDF和UDAF开发

操作

1、在Linux文件中创建目录hiveF/lib、HiveF/bin 分别存放jar包,和shell文件

2、将以上三个java程序打成hiveF3.jar包上传到HiveF/lib文件中

3、进入HiveF/bin目录下创建两个文件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、执行shell脚本 ./hive_test.sh 完成后

捕获

© 著作权归作者所有

simpler
粉丝 25
博文 44
码字总数 40338
作品 0
成都
程序员
私信 提问
学习Hadoop资料分享

最近一直在学习Hadoop,没办法,工作需要,最近在网上收集资料时,看到了一个课程,叫Cloudera Hadoop 4系列实战课程(电商业日志流量分析项目),把课程内容的大概给大家看一下,有40课时,看...

adiykk
2013/06/19
955
5
快学Spark 2.0(新特性、含真实项目、纯Scala语言开发、CDH5.7)

快学Spark 2.0(新特性、含真实项目、纯Scala语言开发、CDH5.7) 分享下载地址——https://pan.baidu.com/s/1jHVvIAi 密码: sirk 本课程从基础开始,紧抓重点、言简意赅、深入浅出的讲解Spark...

羞答答的
2017/10/17
0
0
Spark 2.0视频|快学Spark 2.0(新特性、含真实项目、纯Scala语言开发、CDH5.7)

快学Spark 2.0(新特性、含真实项目、纯Scala语言开发、CDH5.7) 分享网盘下载——https://pan.baidu.com/s/1c2F9zO0 密码: pzx9 Spark进入2.0时代,引入了很多优秀特性,性能上有较大提升,A...

jgkmeymds
2017/10/20
0
0
week04_python函数、参数及参数结构

函数 数学定义:y = f(x) ,y是x的函数,x是自变量 python函数: 由若干语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元; 完成一定的功能; 函数的作用: 结构化编程对代...

limingyu0312
2018/08/27
0
0
hive之执行shell脚本注解

#!/usr/bin/env bash # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for a......

skysky
2013/05/28
435
0

没有更多内容

加载失败,请刷新页面

加载更多

编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
35分钟前
6
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
50分钟前
70
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
7
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
今天
9
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部