zoukankan      html  css  js  c++  java
  • hive -- 自定义函数和Transform

                                    hive -- 自定义函数和Transform


        UDF操作单行数据,

        UDAF:聚合函数,接受多行数据,并产生一个输出数据行

        UDTF:操作单个数据

    使用udf方法:

    第一种:

        add jar xxx.jar

        cteate temporary function 方法名;

        注销一个jar方法:drop temporay function 方法名;

    第二种:写一个脚本

        vi cat hive_init

        add jar /home/data/xxx.jar

        create temporary fucntion 方法名 as '类的全限定名'

        hive -i hive_init

    第三种:

        自定义UDF注册为hive的内置函数

    自定义函数:(UDF)

       数据:

        

    package UDF;
    
    import java.util.HashMap;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    
    /**
     * 
     * @author huhu_k
     *
     */
    public class ToLowerCase extends UDF {
    
    	public static HashMap<String, String> provinceMap = new HashMap<>();
    
    	static {
    		provinceMap.put("136", "beijing");
    		provinceMap.put("137", "shanghai");
    		provinceMap.put("138", "shenzhen");
    	}
    
    	// 必须是public
    	public String evaluate(String field) {
    		String lowerCase = field.toLowerCase();
    		return lowerCase;
    	}
    
    	// 必须是public
    	public String evaluate(int field) {
    		String pn = String.valueOf(field);
    		return provinceMap.get(pn.substring(0, 3)) == null ? "huoxing" : provinceMap.get(pn.substring(0, 3));
    	}
    
    }

    1.将name大写变为小写:



    2.数据:



    通过手机号获取手机地址:



    当你在一个类中再次写了方法时,再次导入jar时,要先推出hive,然后在进入hive,然后进行add JAR XXXXX;


    3.数据:


    使用json数据

    package UDF;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.codehaus.jackson.map.ObjectMapper;
    
    public class JsonParser extends UDF {
    
    	public String evaluate(String json) {
    		ObjectMapper objectMapper = new ObjectMapper();
    		try {
    			Moive readValue = objectMapper.readValue(json, Moive.class);
    			return readValue.toString();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    }
    
    package UDF;
    
    public class Moive {
    
    	private String movie;
    	private String rate;
    	private String timeStamp;
    	private String uid;
    	public String getMovie() {
    		return movie;
    	}
    	public void setMovie(String movie) {
    		this.movie = movie;
    	}
    	public String getRate() {
    		return rate;
    	}
    	public void setRate(String rate) {
    		this.rate = rate;
    	}
    	public String getTimeStamp() {
    		return timeStamp;
    	}
    	public void setTimeStamp(String timeStamp) {
    		this.timeStamp = timeStamp;
    	}
    	public String getUid() {
    		return uid;
    	}
    	public void setUid(String uid) {
    		this.uid = uid;
    	}
    	@Override
    	public String toString() {
    		return  movie + "	" + rate + "	" + timeStamp + "	" + uid;
    	}
    	
    	
    }



    然后将查询出来的数据插入到一张表中


    1.使用hive中的自带函数可以解析简单的json数据格式

     create table t_json2 as select get_json_object(line,'$.movie')as movie,get_json_object(line,'$.rate')as rate,get_json_object(line,'$.timeStamp')as timeStamps,get_json_object(line,'$.uid')as uid from  t_json;




    2.使用自定义函数

    create table t_json1 as select split(toJson(line),'	')[0]as movieid,split(toJson(line),'	')[1]as,split(toJson(line),'	')[2]as timestring,split(toJson(line),'	')[3]as uid from t_json;


    ok!!!


    Transform:

    HiveTransform关键字提供了在SQL中调用自写脚本的功能

    例子:



    先编辑一个python脚本文件

    #!/bin/python
    import sys
    import datetime
    
    for line in sys.stdin:
      line = line.strip()
      movieid, rating, unixtime,userid = line.split('	')
      weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
      print '	'.join([movieid, rating, str(weekday),userid])

    将文件加入hive的路径classpath

    add file /home/data/weekday_mapper.py;

    创建一个表:

    create table t_json_day as select transform (movieid,rate,timestring,uid) using 'python weekday_mapper.py' as (movieid,rate,weekday,uid) from t_json1;
    

  • 相关阅读:
    spring cloud 和 阿里微服务spring cloud Alibaba
    为WPF中的ContentControl设置背景色
    java RSA 解密
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Hystrix 配置参数全解析
    spring cloud 2020 gateway 报错503
    Spring Boot 配置 Quartz 定时任务
    Mybatis 整合 ehcache缓存
    Springboot 整合阿里数据库连接池 druid
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
  • 原文地址:https://www.cnblogs.com/meiLinYa/p/9302988.html
Copyright © 2011-2022 走看看